主要总结GIT常用的各种命令。
当然,这里总结的是GIT命令中的冰山一角,不过也是常用的命令,记住命令可以帮助我们快速实现我们的操作。
我个人还是建议多使用git help来帮助自己找到想要的命令,然后通过git command -help查看具体的使用,命令用多了就能熟记于心。

1.关于新建命令
1.【git init】–新建一个空仓库或者重新初始化一个已经存在的仓库
$ mkdir index-git
$ cd index-git
$ git init
Initialized empty Git repository in E:/git_code/index-git/.git/

新建仓库的目录:

$ cd .git

XXXXXT MINGW64 /e/git_code/index-git/.git (GIT_DIR!)
$ ll
total 7
-rw-r--r-- 1 10008 1049089 130 三月   27 15:25 config
-rw-r--r-- 1 10008 1049089  73 三月   27 15:25 description
-rw-r--r-- 1 10008 1049089  23 三月   27 15:25 HEAD
drwxr-xr-x 1 10008 1049089   0 三月   27 15:25 hooks/
drwxr-xr-x 1 10008 1049089   0 三月   27 15:25 info/
drwxr-xr-x 1 10008 1049089   0 三月   27 15:25 objects/
drwxr-xr-x 1 10008 1049089   0 三月   27 15:25 refs/
2.【git init –bare】 --新建一个裸仓库
$ mkdir bare-git
$ cd bare-git
$ git init --bare
Initialized empty Git repository in E:/git_code/bare-git/

注意:裸仓库的目录:

XXXXXT MINGW64 /e/git_code/bare-git (BARE:master)
$ ll
total 8
-rw-r--r-- 1 10008 1049089 104 三月   27 14:59 config
-rw-r--r-- 1 10008 1049089  73 三月   27 14:59 description
-rw-r--r-- 1 10008 1049089  23 三月   27 14:59 HEAD
drwxr-xr-x 1 10008 1049089   0 三月   27 14:59 hooks/
drwxr-xr-x 1 10008 1049089   0 三月   27 14:59 info/
drwxr-xr-x 1 10008 1049089   0 三月   27 14:59 objects/
drwxr-xr-x 1 10008 1049089   0 三月   27 14:59 refs/

两者的区别:
git init新建的库除了.git目录外,还包含源文件,因此拥有一个可进行修改和新增的本地库;
git init –bare新建的库只有.git目录下的文件,这些文件都用于保存版本库提交后的内容,不提供源文件的存储。因此裸库适用于远程共享库,每个人都在本地编写源码,最后都往裸库中提交。

3.【git status】 --查看工作空间文件状态
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        new.txt

nothing added to commit but untracked files present (use "git add" to track)
4.【git status –s】 –查看简介的工作空间状态
$ git status -s
?? new.txt
2.关于向上提交的命令
5.【git add fileName】 --把指定文件添加到暂存区或者索引区index
$ git add new.txt
6【git add .】 –把工作空间修改或者新增的所有文件都添加到暂存区或者索引区index
7.【git rm –cached filename】 –把指定文件从暂存区或者索引区移除
$ git rm --cached new.txt
rm 'new.txt'
8.【git ls-files –stage】 –查看索引文件内容
$ git ls-files --stage
100644 d670460b4b4aece5915caf5c68d12f560a9fe3e4 0       new.txt
9.【git cat-file –p sha-1】 –查看sha-1码对应的文本内容
$ git cat-file -p d67046
test content

注意:d670246为40位的缩写形式,一般缩写至6位左右.

10.【git cat-file –t sha-1】 –查看sha-1码对应的类型
$ git cat-file -t d67046
blob

注意:blob表示对象类型,还有其他三种类型:tree对象、committer对象和tag对象。

11.【git cat-file –s sha-1】 –查看sha-1码对应文件的大小,单位为字节
$ git cat-file -s d67046
13
12.【git commit –m ‘comment’】 –把暂存区或者索引区文件提交到版本库
$ git commit -m 'add new file to master'
[master (root-commit) 7febc2b] add new file to master
 1 file changed, 1 insertion(+)
 create mode 100644 new.txt
13.【git commit –a】 –把工作空间修改的文件提交到版本库,相当于add + commit –m的操作;
$ echo '# test content' >> new.txt
$ echo "test2 content" > test.txt
$ git status -s
 M new.txt
?? test.txt

$ git commit -a
[master d1656eb] :q
 1 file changed, 1 insertion(+)

$ git status -s
?? test.txt

注意:命令只能提交tracked的文件,新增的文件不能被提交。

14.【git push [alias] [branch]】 --将会把当前分支merge到alias上的[branch]分支.如果分支已经存在,将会更新,如果不存在,将会添加这个分支.

如果有多个人向同一个remote repo push代码, Git会首先在你试图push的分支上运行git log,检查它的历史中是否能看到server上的branch现在的tip,如果本地历史中不能看到server的tip,说明本地的代码不是最新的,Git会拒绝你的push,让你先fetch,merge,之后再push,这样就保证了所有人的改动都会被考虑进来.

15.【git stash】 --把当前目录和index中的所有改动(但不包括未track的文件)压入一个栈,然后留给你一个clean的工作状态,即处于上一次最新提交处
$ git stash
Saved working directory and index state WIP on secondSlave: 777a016 modify new.txt

注意:可以通过git stash save message给内容增加一个信息。

16.【git stash list】 –查看栈列表
$ git stash list
stash@{0}: WIP on secondSlave: 777a016 modify new.txt
【git stash apply】 --取出stash中最近的暂存(stash@{0}),并且应用于当前的工作目录
$ git stash apply
Removing new.txt
………

如果有多个stash,则可以通过git stash apply stash@{1}命令指定.

17.【git stash pop】 –应用当前栈内容的当时,删除该栈;
$ git stash list
stash@{0}: WIP on secondSlave: 777a016 modify new.txt
stash@{1}: WIP on secondSlave: 777a016 modify new.txt

$ git stash pop
Removing new.txt
……

$ git stash list
stash@{0}: WIP on secondSlave: 777a016 modify new.txt
18.【git stash clear】 –清除暂存
19.【git stash drop stash@{0}】 –移除某次暂存
20.【git clean】–移除工作空间untracked的文件
3.关于向下撤回的命令
21.【git fetch】 –获取远程仓库里的新分支和数据
22.【git fetch –all】 –获取远程仓库的所有分支和数据
23.【get fetch [alias]】 –获取远程仓库中指定alias的分支和数据

注意:fetch将会取到所有你本地没有的数据,所有取下来的分支可以被叫做remote branches,它们和本地分支一样(可以看diff,log等,也可以merge到其他分支),但是Git不允许你checkout到它们.

24.【git merge [branch]】 –把branch分支合并到当前分支

注意:合并过程中若有冲突,则需要手动解决掉。

XXXXXT MINGW64 /e/git_code/index-git (slave)
$ git ls-files --stage
100644 efbee594d27c2e2cfc9dcea464acc9904bc34a4d 0       new.txt
100644 e17239a9893661d530829485032c7c5f11b8c844 0       test.txt

XXXXXT MINGW64 /e/git_code/index-git (slave)
$ git merge secondSlave
Updating c8d7ad7..8008ed1
Fast-forward
 new.txt | 1 +
 1 file changed, 1 insertion(+)

XXXXXT MINGW64 /e/git_code/index-git (slave)
$ git ls-files --stage
100644 9b11389f0d9bf6a8db911509bdb9e191d9a2dd75 0       new.txt
100644 e17239a9893661d530829485032c7c5f11b8c844 0       test.txt
25.【git pull】 –首先执行git fetch获取分支内容,然后执行git merge合并内容;这个merge操作会产生一个新的commit.
26.【git rebase branch –branch】分支合并到本地分支。命令执行的结果与merge一样
XXXXXT MINGW64 /e/git_code/index-git (secondSlave)
$ git ls-files --stage
100644 3dd82c153714081cba76050b93eda31371d4cb99 0       new.txt
100644 e17239a9893661d530829485032c7c5f11b8c844 0       test.txt
XXXXXT MINGW64 /e/git_code/index-git (secondSlave)
$ git checkout slave
Switched to branch 'slave'
XXXXXT MINGW64 /e/git_code/index-git (slave)
$ git ls-files --stage
100644 9b11389f0d9bf6a8db911509bdb9e191d9a2dd75 0       new.txt
100644 e17239a9893661d530829485032c7c5f11b8c844 0       test.txt
XXXXXT MINGW64 /e/git_code/index-git (slave)
$ git rebase secondSlave
First, rewinding head to replay your work on top of it...
Fast-forwarded slave to secondSlave.

XXXXXT MINGW64 /e/git_code/index-git (slave)
$ git ls-files --stage
100644 3dd82c153714081cba76050b93eda31371d4cb99 0       new.txt
100644 e17239a9893661d530829485032c7c5f11b8c844 0       test.txt

关于rebase和merge的区别可以看这篇文章https://www.cnblogs.com/kidsitcn/p/5339382.html

4.关于工作空间和暂存区的比较
27.【git diff】 –比较工作目录中当前文件和暂存区域快照之间的差异,即工作空间修改后没有提交的内容
$ echo '#test conten' >> new.txt
$ git status -s
 M new.txt
A  test.txt

$ git diff
diff --git a/new.txt b/new.txt
index d11bd65..60985b8 100644
--- a/new.txt
+++ b/new.txt
@@ -1,2 +1,3 @@
 test content
 # test content
+#test conten

注意:此时test.txt文件已经添加至暂存区。

28.【git diff –cached】 –对比此刻暂存区与上次提交时的快照之间的差异
$ git diff --cached
diff --git a/new.txt b/new.txt
index d11bd65..60985b8 100644
--- a/new.txt
+++ b/new.txt
@@ -1,2 +1,3 @@
 test content
 # test content
+#test conten
diff --git a/test.txt b/test.txt
new file mode 100644
index 0000000..6ad93f6
--- /dev/null
+++ b/test.txt
@@ -0,0 +1 @@
+test2 content

表明有两个文件有修改,其中修改new.txt文件并新增内容”#test conten”,新增test.txt文件并新增内容”test2 content”。

29.【git diff HEAD】 –比较工作空间与上次提交之间所有改动,包括工作空间和暂存区的改动
$ echo '#test1 content' >> new.txt
$ git diff HEAD
diff --git a/new.txt b/new.txt
index d11bd65..9acd55a 100644
--- a/new.txt
+++ b/new.txt
@@ -1,2 +1,4 @@
 test content
 # test content
+#test conten
+#test1 content
diff --git a/test.txt b/test.txt
new file mode 100644
index 0000000..6ad93f6
--- /dev/null
+++ b/test.txt
@@ -0,0 +1 @@
+test2 content
30.【git diff [–stat] branchName】 –查看branchName后的改动
$ git diff slave
diff --git a/new.txt b/new.txt
index d11bd65..d670460 100644
--- a/new.txt
+++ b/new.txt
@@ -1,2 +1 @@
 test content
-# test content
diff --git a/test.txt b/test.txt
new file mode 100644
index 0000000..6ad93f6
--- /dev/null
+++ b/test.txt
@@ -0,0 +1 @@
+test2 content
5.关于撤销的操作
31.【git reset –soft HEAD^n】 –回退到第n个版本,仅仅版本库回退
$ git reset --soft HEAD^1
32.【git reset –mixed HEAD^n】–回退到第n个版本,版本库\索引区index文件回退
$ git reset --mixed HEAD^1
33.【git reset –hard HEAD^n】 --回退到第n个版本,版本库\索引区index文件\工作空间都回退
$ git reset --hard HEAD^1
HEAD is now at 0979002 third commit

注意:因为会把工作空间一并回退,因此可能会造成数据丢失,谨慎操作。

34.【git reset head filename】 –单独针对filename文件,恢复到上次add状态;
35.【git rm file】 –把文件file从缓存区移除,同时移除出工作目录
$ git rm new.txt
rm 'new.txt'
36.【git rm –cached file】 –把文件file从缓存区移除,但保留在工作目录
$ git rm --cached test.txt
rm 'test.txt'
6.关于分支的操作:
37.【git branch】 –查看本地所有分支,当前分支会被星号标出
$ git branch
* master
  slave
38.【git branch branchName】 –新建分支branchName
$ git branch slave
39.【git branch –d branchName】 –删除分支branchName
$ git branch -d slave
Deleted branch slave (was d1656eb).
40.【git branch –D branchName】 –强行删除分支branchName
41.【git branch –v】–查看所有分支的最后一次提交
$ git branch -v
* master d1656eb :q
  slave  d1656eb :q
42.【git checkout branchName】 –检出分支branchName
$ git checkout slave
Switched to branch 'slave'
M       new.txt
A       test.txt

$ git branch
  master
* slave
43.【git checkout –b branchName】 –创建并切换到新的分支
$ git checkout -b secondSlave
Switched to a new branch 'secondSlave'
M       new.txt
A       test.txt

$ git branch
  master
* secondSlave
  slave
44.【git checkout fileName】 –使用HEAD中fileName文件覆盖工作空间中fileName文件内容
$ echo "test content" > new.txt
$ cat new.txt
test content

$ git checkout new.txt
Updated 1 path from the index
$ cat new.txt
test content
# test content
#test conten
7.关于日志的操作
45.【git reflog】是对reflog进行管理的命令,reflog是git用来记录引用变化的一种机制,比如记录分支的变化或者是HEAD引用的变化.
$ git reflog
0979002 (HEAD -> slave, secondSlave) HEAD@{0}: reset: moving to HEAD
0979002 (HEAD -> slave, secondSlave) HEAD@{1}: reset: moving to HEAD
0979002 (HEAD -> slave, secondSlave) HEAD@{2}: reset: moving to HEAD^1
68567f4 HEAD@{3}: reset: moving to HEAD^1
0379ecc HEAD@{4}: commit: houhui2
68567f4 HEAD@{5}: reset: moving to HEAD^1
62cefbb HEAD@{6}: commit: fanhui
68567f4 HEAD@{7}: reset: moving to HEAD^1
3cd1815 HEAD@{8}: reset: moving to HEAD
3cd1815 HEAD@{9}: reset: moving to HEAD
3cd1815 HEAD@{10}: commit: reset first commit
68567f4 HEAD@{11}: reset: moving to HEAD
68567f4 HEAD@{12}: reset: moving to HEAD
…

git reflog不指定引用的时候,默认列出HEAD的reflog;HEAD@{0}代表HEAD当前的值,HEAD@{3}代表HEAD在3次变化之前的值。git会将变化记录到HEAD对应的reflog文件中,其路径为.git/logs/HEAD,分支的reflog文件都放在.git/logs/refs目录下的子目录中.

46.【git log】–显示当前分支的提交日志
47.【git log branch】 –显示branch分支的提交日志
48.【git log –p】 –每次的提交都是一个快照,git会把每次提交的diff计算出来,会以补丁的形式呈现;
49.【git log –stat】–跟git log –p差不多,但更简洁,不会展示diff的内容
50.【git log –decorate】 –显示每次提交的简单信息
51.【git log –oneline branch1 ^branch2】 –查看在分支1提交却不在分支2上的提交
52.【git log --oneline --graph】 –以图形化的形式显示出当前分支的提交记录
53.【git long --oneline --n】 –显示n个提交记录,每个记录仅显示一行
8.总结

最后总结出一个简化的命令图。
命令图

后面还会不断的更新命令。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐