Git常用命令速查

Git常用命令速查

本文简单介绍了Git本地仓库的构建,与远程仓库的关联。

安装Git #

ubuntu下安装:

1sudo apt install git

windows 下安装,需 下载安装包

Git 本地仓库的创建 #

通俗地讲,本地任何一个目录都可以是本地仓库。只需要启动Terminal(ubuntu)或Git Bash(windows),cd进入指定目录,运行

1git init

即可以初始化一个空的本地仓库。此时,该目录下会多出一个.git子目录,它是Git用来跟踪管理版本库的。当然,如果你想取消版本管理,删除这个目录即可。

Git 不同于 Subversion 的地方在于,Git是分布式的版本管理系统,没有中央服务器。这大概解释了Git可以创建本地仓库的原因,而Subversion的使用必须要借助互联网

关于集中式分布式的讨论,此处不作多的说明,没有使用经验支撑,那些优劣列出来,没有什么意义。

Git 关联GitHub远程仓库 #

Git支持基于SSH和https关联远程仓库,但推荐使用SSH方式,它更加安全。在本地仓库要想和GitHub远程仓库关联,首先需要在GitHub中配置SSH and GPG keys。

通过

1ssh-keygen -t rsa -C "wangy325@qq.com"

获取ssh密钥文件,操作过程中会提示确认保存文件的位置以及要求输入密码,以下是命令输出(windows 平台)。

 1Generating public/private rsa key pair.
 2Enter file in which to save the key (/c/Users/mayn/.ssh/id_rsa):
 3Enter passphrase (empty for no passphrase):
 4Enter same passphrase again:
 5Your identification has been saved in /c/Users/mayn/.ssh/id_rsa.
 6Your public key has been saved in /c/Users/mayn/.ssh/id_rsa.pub.
 7The key fingerprint is:
 8SHA256:Yy7sS0KnY+iaQDLldwI43znocIboZhDbD5ZPwjzMybU wangy325@qq.com
 9The key's randomart image is:
10+---[RSA 2048]----+
11|                 |
12| .               |
13|+ o .            |
14|./ B o           |
15|O.^ E o S        |
16|=B @ B o .       |
17|.+o B + .        |
18|+o . = .         |
19|o..   o.         |
20+----[SHA256]-----+

命令执行完成之后,会在 c/Users/mayn/ 下生成一个.ssh目录,里面包含了密钥信息。

然后在GitHub页面添加新的ssh key,配置完成以后,便可以将本地仓库和远程仓库关联,并将本地文件上传到远程(通常,你需要先add并且commit文件到本地版本库):

1git remote add origin git@github.com:wangy325/repositoryName.git
2git push -u origin master

Git的工作模式简单介绍 #

  • 工作区(workspace):即当前工作目录
  • 暂存区(stage/index):.log目录下的的index文件中,暂存区域保存的是本地已add但未commit的改动
  • 版本库(local repository):本地版本库,commit之后文件信息变保存在其中
  • 远程仓库(remote repository):远程版本库,push推送本地文件到远程版本库,fetch从远程版本库拉取 资源 版本信息,pull从远程版本库中拉取资源

imLgtx.png

Git本地工作区,暂存区,版本库的概念,图引自 易百教程

Git 版本控制的一些主要概念:

  • 3个步骤:
    1. add命令只添加文件到暂存区
    2. commit命令将文件添加到本地版本库
    3. push命令将本地版本库的内容推送到远程仓库
  • 4个区:
    1. workingAera:当前工作空间
    2. stage:暂存区,已修改并add的文件在此区
    3. local repository:本地仓库
    4. remote repository:远程仓库
  • 5种状态
    1. origin:被git追踪但未作任何修改
    2. modified:已修改但未add到暂存区
    3. staged:已修改并add到暂存区
    4. committed:已提交到本地仓库
    5. pushed:已推送到远程仓库

常用命令 #

git command --help 可以打开帮助文档
git config --global credential.helper store 保存用户凭证,避免每次push/pull都需要输入密码

添加文件到暂存区 #

1git add file1 ...

提交文件到仓库之前,需要配置用户名和电子邮件

1git config --global user.name "wangy325"
2git config --global user.email "wangy325@qq.com"

提交文件到仓库 #

1git commit -m "commit comment"

查看当前仓库的状态 #

 1$ git status
 2On branch master
 3Your branch is up to date with 'origin/master'.
 4
 5Changes not staged for commit:
 6  (use "git add <file>..." to update what will be committed)
 7  (use "git checkout -- <file>..." to discard changes in working directory)
 8
 9        modified:   readme.md
10
11Untracked files:
12  (use "git add <file>..." to include in what will be committed)
13
14        Main.java
15
16no changes added to commit (use "git add" and/or "git commit -a")

查看某个文件的差异信息 #

git diff
  查看暂未`add`到暂存区的改动,也就是状态为`modified`的文件,
  如果文件已经`staged`,则此命令不会显示差异信息

git diff --cached
  查看已经`add`到暂存区的改动,也就是状态为`staged`的文件,
  如果文件处于`modified`状态,则此命令不会显示差异信息

git diff HEAD
  查看已暂存和未暂存的所有改动

git diff --stat
  显示差异的摘要信息

git diff master origin/master
  显示本地仓库和远程仓库之间的文件的差异信息,即`committed`和`pushed`两个状态之间的差异

git diff versionCode1 versionCode2
  显示两个版本(号)之间的差异信息,`less`打开
 1$ git diff readme.md
 2warning: LF will be replaced by CRLF in readme.md.
 3The file will have its original line endings in your working directory.
 4diff --git a/readme.md b/readme.md
 5index bb8298f..222e2da 100644
 6--- a/readme.md
 7+++ b/readme.md
 8@@ -6,3 +6,5 @@
 9 - Java的回调机制
10 - idea的多线程调试
11 - 拦截器
12+
13+> you can't live your life based on other people's point of view.

查看提交日志 #

git log [<options>] [<revision-range>] [[--] <path>...]
1$ git log
2commit cf3d291b043457536f5851c3517c94f6f50d4c94 (HEAD -> master, origin/master)
3Author: wangy325 <wangy325@qq.com>
4Date:   Wed Sep 19 12:11:13 2018 +0800
5
6    update readme.md
7...

上面的日志显示 HEAD 的版本号cf3d291b043457536f5851c3517c94f6f50d4c94,括号内显示,本地仓库和远程仓库的文件是一致的(最新的),以下是commit但是没有push到远程仓库的日志记录:

1commit f67ec47c9df0f0f8351413ef64494e908d7183a0 (HEAD -> master)
2Author: wangy325 <wangy325@qq.com>
3Date:   Thu Sep 20 17:29:09 2018 +0800
4
5    add motto
6
7commit cf3d291b043457536f5851c3517c94f6f50d4c94 (origin/master)
8...

上面的日志显示,本地HEAD最新的版本号和远程仓库的版本号不一致,暗示本地仓库的改动还未提交到远程仓库。

由于可视化工具的强大,现在很少直接使用git log命令来查看提交日志,如果想查看,可以使用如下常用命令:

git log --oneline  仅展示hash和提交信息
git log --pretty=format:"%h - %an, %ar : %s"  按格式展示提交信息  
git log --pretty=:"%h: %an %s" --graph  按格式展示提交信息,--graph表示合并信息
git log --oneline --decorate --graph --all 展示提交历史,分支指向及分支分叉情况

撤销修改 #

如果使用命令行操作Git,往往能够得到不错的操作提示。Git的有几种方式支持撤消操作,分别对应不同的使用情景。

  1. 漏提交了几个文件

    有时候,我们可能不小心,漏提交了几个文件,或者提交信息写错了,可以使用--amend来挽回〔损失〕。

     git commit --amend 
    

    这时候,Git会弹出一个Vim操作界面,让你修改提交信息。

  2. 取消暂存的文件

    更多时候,可能由于“手滑”,需要取消添加到暂存区的文件,这个时候,就需要git restore命令了。

     git restore --staged <file> ...
    

    git restore还有个不带--storage参数的版本,用来恢复对工作区未暂存文件的修改:

     git restore <file>...
    

    这个操作要谨慎,对于Git来说,未提交的修改,一旦撤消,就不可恢复。而已经提交的修改,都是可以恢复的。

    此外,get reset命令也可以完成同样的操作:

     git reset HEAD <file>
    

    git reset命令很强大,使用要谨慎。

  3. 丢弃已经提交的修改

    要撤消对文件的修改,将其恢复成为修改前的样子,方法就是使用git restore命令。此外,还可以使用git checkout命令。

    一般认为,git checkout用来切换分支。

     git checkout -- <file>...
    

    同样地,checkout也是一个⚠️危险的命令。

从工作区和索引中删除文件 #

git rm [-f|--force][-n][-r][--cached][--ignore-unmatch][--quiet][--] <file>…

1 git rm <file>

从当前工作目录中删除文件,这个文件将会从工作空间物理删除,然后commit,版本库中的改文件信息会被删除

 1$ git rm text2.md
 2rm 'text2.md'
 3
 4$ git status
 5On branch master
 6Your branch is ahead of 'origin/master' by 5 commits.
 7  (use "git push" to publish your local commits)
 8
 9Changes to be committed:
10  (use "git reset HEAD <file>..." to unstage)
11
12        deleted:    text2.md
13
14$ git commit -m "aaa"
15[master d0ba06d] aaa
16 1 file changed, 1 deletion(-)
17 delete mode 100644 text2.md

2 git rm -f <file>

如果当前文件已经在暂存区,则将其从暂存区工作空间中移除(移除版本信息),commit 之后,其将不在版本库中

 1$ git add t3.md
 2warning: LF will be replaced by CRLF in t3.md.
 3The file will have its original line endings in your working directory.
 4
 5$ git rm t3.md
 6error: the following file has changes staged in the index:
 7    t3.md
 8(use --cached to keep the file, or -f to force removal)
 9
10$ git rm -f t3.md
11rm 't3.md'
12
13$ git status
14On branch master
15Your branch is ahead of 'origin/master' by 6 commits.
16  (use "git push" to publish your local commits)
17
18nothing to commit, working tree clean

3 git rm --cached <file>

如果当前文件改动已经add到暂存区,使用该命令从暂存区中移除版本信息,但是工作空间中还存在,commit之后,其将不在版本库中

 1$ git add t3.md
 2warning: LF will be replaced by CRLF in t3.md.
 3The file will have its original line endings in your working directory.
 4
 5$ git rm --cached t3.md
 6rm 't3.md'
 7
 8$ ls
 9me/  readme.md  t3.md
10
11$ git status
12On branch master
13Your branch is ahead of 'origin/master' by 7 commits.
14  (use "git push" to publish your local commits)
15
16Changes to be committed:
17  (use "git reset HEAD <file>..." to unstage)
18
19        deleted:    t3.md
20
21Untracked files:
22  (use "git add <file>..." to include in what will be committed)
23
24        t3.md