一个爱学习,知上进,善沟通,重细节,懂感恩的人

0%

git教程

git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目
git是Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件
git与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持
  1. 安装git

  • Linux/Unix上安装git
1
# apt-get install git

or

1
# yum install git
  • Windows上安装git

https://git-scm.com/download/win

  • Mac OS X上安装git

https://sourceforge.net/projects/git-osx-installer/

  • 配置git用户信息
1
2
3
$ git config --global user.name "Your Name"

$ git config --global user.email "email@example.com"
  1. git开始

  • 创建仓库

首先创建仓库文件夹,然后右键点击Git Bash Here,接着执行以下命令

1
$ git init
  • 创建文件

随便创建一个文本文件readme.txt,内容随便填写

  • 添加到仓库
1
$ git add readme.txt
  • 提交到仓库
1
2
3
4
$ git commit -m "本次提交的说明"
[master (root-commit) f7eff6a] 本次提交的说明
1 file changed, 1 insertion(+)
create mode 100644 readme.txt

-m后面输入的是本次提交的说明,git commit命令执行成功后会提示,1 file changed:1个文件被改动(新添加的readme.txt文件),1 insertion(+):插入了一行内容(readme.txt有一行内容)

使用命令git add <file>可以多次添加一个文件,或者一次多个文件,使用命令git commit -m <message>完成提交

  1. git入门

  • 修改文件

修改上次提交的readme.txt,随便增加几行内容,保存完毕后输入以下命令

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

git status命令可以让我们掌握仓库当前的状态,上面的命令输出告诉我们readme.txt被修改了,但是还没有准备提交

  • 查看修改内容
1
2
3
4
5
6
7
8
9
10
11
12
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 2733fb3..65c4162 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,3 @@
-<CE>ҵĵڶ<FE>ƪ<B2><A9><BF><CD>
\ No newline at end of file
+我的第二篇博客 增加两行代码
+git add readme.txt
+git commit -m "本次提交的说明"
\ No newline at end of file

git diff是difference单词的缩写,就是区别的意思,显示的格式是Unix通用的diff格式,可以从上面的命令输出看到添加了两行代码,注意:如果中文显示乱码则是文本文件的编码格式不是UTF-8

  • 提交操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ git add readme.txt

$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: readme.txt

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

readme.txt.bak

$ git commit -m "增加两行代码"
[master a570466] 增加两行代码
1 file changed, 3 insertions(+), 1 deletion(-)

$ git status
On branch master
nothing to commit, working tree clean

随时查看工作区的状态,使用git status命令,使用git diff可以查看修改内容

  1. git版本回退

  • 查看历史记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ git log
commit 088bfdbb769668306ed0969ce25caa874292b05b (HEAD -> master)
Author: xixiwan <liaoxiting2011@163.com>
Date: Thu Oct 11 13:40:40 2018 +0800

随便加一点 回退测试

commit 2a3f733dc2b4f180d4a68448302c1b4ec75c1ef0
Author: xixiwan <liaoxiting2011@163.com>
Date: Thu Oct 11 13:30:33 2018 +0800

又增加两行代码

commit a5704660777c05aeab992f088afe9af1b8fc1ce8
Author: xixiwan <liaoxiting2011@163.com>
Date: Thu Oct 11 13:19:05 2018 +0800

增加两行代码

commit f7eff6aaa69b4ee66d95d936ab3e280416a97143
Author: xixiwan <liaoxiting2011@163.com>
Date: Thu Oct 11 10:59:15 2018 +0800

提交测试文件

git log命令可以查看从最近到最早的提交日志,我们可以看到有3次提交,最近的一次是随便加一点 回退测试,上一次是又增加两行代码,最早的一次是提交测试文件

  • 回退到某个版本

    我们打算回退到又增加两行代码这个版本,git回退必须要知道是哪个版本,也就是刚才通过git log显示的088bfdbb769668306ed0969ce25caa874292b05b,如果要回退到这个版本有几种方式来操作,你可以用命令git reset --hard HEAD^,用HEAD表示当前版本,HEAD^表示上一个版本,上上个版本HEAD^^,以此类推,但是当回退版本是比较早的时候,需要写^太多了,这个时候可以用HEAD~100来表示上100个版本,也可以用命令git reset --hard 088bfdbb769668306ed0969ce25caa874292b05b指定版本号

1
2
$ git reset --hard HEAD~1
HEAD is now at 2a3f733 又增加两行代码

这样显示说明已经回退到你想要的版本了,你可以点击查看一下文件是否回退到你想要的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ git log
commit 2a3f733dc2b4f180d4a68448302c1b4ec75c1ef0 (HEAD -> master)
Author: xixiwan <liaoxiting2011@163.com>
Date: Thu Oct 11 13:30:33 2018 +0800

又增加两行代码

commit a5704660777c05aeab992f088afe9af1b8fc1ce8
Author: xixiwan <liaoxiting2011@163.com>
Date: Thu Oct 11 13:19:05 2018 +0800

增加两行代码

commit f7eff6aaa69b4ee66d95d936ab3e280416a97143
Author: xixiwan <liaoxiting2011@163.com>
Date: Thu Oct 11 10:59:15 2018 +0800

提交测试文件

通过git log我们可以看到版本已经少了随便加一点 回退测试,如果回退错了,想再回退到随便加一点 回退测试这个版本怎么办呢,通过命令git reflog查看你每一次的操作

1
2
3
4
5
6
$ git reflog
2a3f733 HEAD@{1}: reset: moving to HEAD~1
088bfdb (HEAD -> master) HEAD@{2}: commit: 随便加一点 回退测试
2a3f733 HEAD@{3}: commit: 又增加两行代码
a570466 HEAD@{4}: commit: 增加两行代码
f7eff6a HEAD@{5}: commit (initial): 提交测试文件

可以看到上次回退之前的版本是088bfdb,可以通过git reset --hard 088bfdb来回退

1
2
$ git reset --hard 088bfdb
HEAD is now at 088bfdb 随便加一点 回退测试

这样就回退到随便加一点 回退测试这个版本了

HEAD指向的版本就是当前版本,git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id,回退前,用git log可以查看提交历史,以便确定要回退到哪个版本,要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本

  1. git修改、撤销、删除

  • 工作区与暂存区

工作区就是看到文件的地方,就是一开始创建的文件夹,就是一个工作区,用git add把文件添加进去,实际上就是把文件修改添加到暂存区,用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支

  • 修改

git跟踪并管理的是修改,而非文件,就是每修改一次,比如添加一个字符,删除一行都算一次修改,为什么这么说,下面做一个演示,首先修改readme.txt随便添加一点内容,然后git add

1
2
3
4
5
6
7
8
$ git add readme.txt

$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: readme.txt

然后再修改readme.txt再添加一点内容,然后提交

1
2
3
$ git commit -m "修改了两次只有第一次add了"
[master 948a06a] 修改了两次只有第一次add了
1 file changed, 4 insertions(+), 2 deletions(-)

提交后再查看状态

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

可以看到第二次修改的内容没有提交,为什么会这样呢?来看刚才的操作是第一次修改->git add->第二次修改->git commit,可以发现第二次修改并没有git add,说明第二次的修改没有add到暂存区,所以只提交了第一次修改的,因为git提交只负责把暂存区的修改提交,我们可以通过git diff HEAD -- readme.txt查看工作区和版本库里面最新版本的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 07733ee..ada7af0 100644
--- a/readme.txt
+++ b/readme.txt
@@ -7,4 +7,6 @@ git diff readme.txt

随便添加一点东西 反正要回退

-我再加一点内容
\ No newline at end of file
+我再加一点内容
+
+我继续再加一点内容
\ No newline at end of file

可以看到第二次修改的内容确实没有提交,那怎么提交第二次修改呢?你可以继续git addgit commit,也可以别着急提交第一次修改,先git add第二次修改,再git commit,就相当于把两次修改合并后一块提交了:第一次修改->git add->第二次修改->git add->git commit

每次修改,如果不用git add到暂存区,那通过git commit就不会提交到分支

  • 撤销

当你写了一部分代码,提交的时候发现根本不需要这个,这个时候就只能撤销了

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

我们可以看到readme.txt已经被修改了,你可以看到git的提示,git checkout -- <file>可以丢弃工作区的修改

1
2
3
4
5
$ git checkout -- readme.txt

$ git status
On branch master
nothing to commit, working tree clean

命令git checkout -- readme.txt意思就是把readme.txt文件在工作区的修改全部撤销,这里有两种情况:一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git addgit commit时的状态。注意git checkout -- <file>命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在下面的分支管理中会再次遇到git checkout命令

1
2
3
4
5
6
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: readme.txt

我们可以看到readme.txt已经被修改,而且还add到暂存区了,你可以看到git的提示git reset HEAD <file>可以撤销掉暂存区的修改

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt

$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

这样我们就可以撤销了,通过git status可以看到已经撤销到工作区了,有修改但是没有add,如果这部分修改也不要的话就执行下面代码

1
2
3
4
5
$ git checkout -- readme.txt

$ git status
On branch master
nothing to commit, working tree clean

这样就是还原到没有修改的时候了

当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- <file>,当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,第二步用命令git checkout -- <file>操作。

  • 删除

我们新增一个test.txt

1
2
3
4
5
6
$ git add test.txt

$ git commit -m "新增test文件"
[master f764427] 新增test文件
1 file changed, 1 insertion(+)
create mode 100644 test.txt

test.txt文件删除

1
2
3
4
5
6
7
8
9
10
11
$ rm test.txt

$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

deleted: test.txt

no changes added to commit (use "git add" and/or "git commit -a")

git已经知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了,如果你确定要把文件从版本库删除就执行以下命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ git rm test.txt
rm 'test.txt'

$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

deleted: test.txt

$ git commit -m "删除test文件"
[master 5db3e93] 删除test文件
1 file changed, 1 deletion(-)
delete mode 100644 test.txt

$ git status
On branch master
nothing to commit, working tree clean

命令git rm用于删除一个文件。如果删除了也可以通过命令git checkout -- <file>来撤销操作,如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

  1. git分支管理

  • 分支的创建与合并

首先,我们创建dev分支,然后切换到dev分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git branch
* master

$ git branch dev

$ git branch
dev
* master

$ git checkout dev
Switched to branch 'dev'

$ git branch
* dev
master

上面的操作步骤是首先查看所有分支->创建dev分支->查看所有分支->切换到dev分支->查看所有分支*号代表当前所在分支,上面的分支创建与切换也可以换成一条命令git checkout -b dev

我们在当前分支上随便修改,然后提交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ git status
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

$ git add readme.txt

$ git commit -m "在dev分支上增加了一行内容"
[dev 26dd46a] 在dev分支上增加了一行内容
1 file changed, 3 insertions(+), 1 deletion(-)

$ git status
On branch dev
nothing to commit, working tree clean

dev分支上已经开发完成,这个时候我们切换到master分支

1
2
$ git checkout master
Switched to branch 'master'

切换回master分支后发现我们修改的内容不见了,这个时候就把’dev’分支合并到’master’分支了

1
2
3
4
5
$ git merge dev
Updating 5db3e93..26dd46a
Fast-forward
readme.txt | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

git merge命令用于合并指定分支到当前分支,合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的了。注意到上面的Fast-forward信息,git说明这次合并是快进模式,也就是直接把master指向dev的当前提交,所以合并速度非常快

合并完成后,就可以放心地删除dev分支了

1
2
3
4
5
$ git branch -d dev
Deleted branch dev (was 26dd46a).

$ git branch
* master

删除dev分支之后,可以看到只剩下master分支了

分支常用命令:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

  • 解决文件冲突

在开发中,文件冲突是一件很正常的事

1
2
3
4
5
6
7
8
9
10
11
12
$ git checkout -b dev
Switched to a new branch 'dev'

$ git branch
* dev
master

$ git add readme.txt

$ git commit -m "在最后一行修改了内容"
[dev ec49cad] 在最后一行修改了内容
1 file changed, 1 insertion(+), 1 deletion(-)

创建dev分支,并且在dev分支上修改了readme.txt文件并提交了,我们切回master分支,也修改readme.txt文件并提交,然后把dev分支合并到master分支

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git checkout master
Switched to branch 'master'

$ git add readme.txt

$ git commit -m "master分支上也在最后一行修改了内容"
[master 9830c2c] master分支上也在最后一行修改了内容
1 file changed, 1 insertion(+), 1 deletion(-)

$ git merge dev
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件

1
2
3
4
5
6
7
8
9
10
11
12
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)

Unmerged paths:
(use "git add <file>..." to mark resolution)

both modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

我们可以查看readme.txt的内容,发现变成了下面这样

<<<<<<< HEAD

dev分支增加内容 master分支上也修改了这行
=======

dev分支增加内容 分支上修改内容
>>>>>>> dev

直接修改readme.txt再提交

1
2
3
4
5
6
7
8
$ git add readme.txt

$ git commit -m "修改冲突后提交"
[master e5d33f7] 修改冲突后提交

$ git status
On branch master
nothing to commit, working tree clean

最后删除dev分支

1
2
3
4
5
$ git branch -d dev
Deleted branch dev (was ec49cad).

$ git branch
* master

当git无法自动合并分支时,就必须手动解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把git合并失败的文件手动编辑为我们希望的内容,再提交

  • 禁用Fast-forward

在开发中,文件冲突是一件很正常的事合并分支时,git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息,如果要强制禁用Fast forward模式,git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息,所以我们可以使用--no-ff方式的git merge

1
2
3
4
5
6
7
8
9
10
11
12
$ git checkout -b dev
Switched to a new branch 'dev'

$ git branch
* dev
master

$ git add readme.txt

$ git commit -m "增加一行禁用--no-ff"
[dev d9eeed6] 增加一行禁用--no-ff
1 file changed, 2 insertions(+)

切回master分支,合并dev分支,请注意--no-ff参数,表示禁用Fast forward

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$ git merge --no-ff -m "禁用Fast forward 合并" dev
Merge made by the 'recursive' strategy.
readme.txt | 2 ++
1 file changed, 2 insertions(+)

$ git log --graph
* commit 042590d922a556be2271e9bd6b1db80bd533db65 (HEAD -> master)
|\ Merge: e5d33f7 d9eeed6
| | Author: xixiwan <liaoxiting2011@163.com>
| | Date: Fri Oct 12 15:06:55 2018 +0800
| |
| | 禁用Fast forward 合并
| |
| * commit d9eeed6bc52a076ce3b2c58a4fb5daadb932f07c (dev)
|/ Author: xixiwan <liaoxiting2011@163.com>
| Date: Fri Oct 12 15:01:18 2018 +0800
|
| 增加一行禁用--no-ff
|
* commit e5d33f7e9a67b9c6bca453423fba73013c60fb12
|\ Merge: 9830c2c ec49cad
| | Author: xixiwan <liaoxiting2011@163.com>
| | Date: Fri Oct 12 14:15:31 2018 +0800
| |
| | 修改冲突后提交
| |
| * commit ec49cadb26a85c03ac3f4da626a22aab3cfff54a
| | Author: xixiwan <liaoxiting2011@163.com>
| | Date: Fri Oct 12 13:59:39 2018 +0800
| |
| | 在最后一行修改了内容
| |
* | commit 9830c2c4710384ab2f08a97839897092d1e5ba4a
|/ Author: xixiwan <liaoxiting2011@163.com>
| Date: Fri Oct 12 14:01:47 2018 +0800
|
| master分支上也在最后一行修改了内容
|
* commit 26dd46afc5ee3004018204b261093bb954754d0a
| Author: xixiwan <liaoxiting2011@163.com>
| Date: Fri Oct 12 13:40:38 2018 +0800
|
| 在dev分支上增加了一行内容

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
干活都在dev分支上,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而Fast forward合并就看不出来曾经做过合并,用git log --graph命令可以看到分支合并图

  • Bug分支

在开发中,出现bug是最正常不过的了,所以当有了bug,我们就需要建一个bug分支,当你接到一个编号为1007的bug任务时,需要创建一个分支issue-1007来修复它,但是,当前正在dev上进行的工作还没有提交,git提供了一个stash功能,可以把当前工作现场起来,等以后恢复现场后继续工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ git checkout dev
Switched to branch 'dev'

$ git status
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

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

new.txt

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash save -u "新功能暂时隐藏"
Saved working directory and index state On dev: 新功能暂时隐藏

$ git stash list
stash@{0}: On dev: 新功能暂时隐藏

这样我们就把新功能开发代码隐藏了,这里需要注意的是git stash save -u里面的-u是把当前的新文件以及旧文件都隐藏起来,如果不加则不在暂存区的则不会隐藏,save是增加此次保存的备注,通过git stash list可以查看所有的隐藏记录,好了,接下来是修复issue-1007bug了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ git checkout master
Switched to branch 'master'

$ git checkout -b issue-1007
Switched to a new branch 'issue-1007'

$ git status
On branch issue-1007
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

$ git add readme.txt

$ git commit -m "修复issue-1007"
[issue-1007 5cc15cd] 修复issue-1007
1 file changed, 1 insertion(+), 1 deletion(-)

我们已经修复issue-1007,切回master分支,然后合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ git checkout master
Switched to branch 'master'

$ git merge --no-ff -m "修复issue-1007 合并到master" issue-1007
Merge made by the 'recursive' strategy.
readme.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

$ git branch
dev
issue-1007
* master

$ git branch -d issue-1007
Deleted branch issue-1007 (was 5cc15cd).

$ git branch
dev
* master

合并完成后我们就删除issue-1007分支,bug解决了就可以回到dev分支再继续开发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ git checkout dev
Switched to branch 'dev'

$ git stash list
stash@{0}: On dev: 新功能暂时隐藏

$ git stash pop stash@{0}
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

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

new.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{0} (a0cb72bbf4ab7c9c67ffcf1df3fa86cf8753407b)

通过git stash list可以获取到所有隐藏记录,git stash pop默认是第一条也就是{0}这个,也可以用命令git stash apply,但是这样是不会删除掉隐藏的记录,需要手动删除git stash dropgit stash clear可以清除所有的隐藏记录

  • Feature分支

在开发中,接到feature-report新功能,所以需要建新功能分支再合并到dev分支上面

1
2
3
4
5
6
7
8
9
10
11
12
$ git checkout -b feature-report
Switched to a new branch 'feature-report'

$ git add report.txt

$ git commit -m "增加统计新功能"
[feature-report e0c2860] 增加统计新功能
1 file changed, 1 insertion(+)
create mode 100644 report.txt

$ git checkout dev
Switched to branch 'dev'

切回dev分支,准备合并的时候,突然说这个功能不要了,这个时候我们只能删除掉新开发的feature-report分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git branch
* dev
feature-report
master

$ git branch -d feature-report
error: The branch 'feature-report' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-report'.

$ git branch -D feature-report
Deleted branch feature-report (was e0c2860).

$ git branch
* dev
master

当要删除feature-report分支的时候,git提示feature-report分支还没被合并,如果要强行删除则需要大写的-D,这样才能删除

  • 本地推送到远程仓库

本地创建了仓库,如果想推送到github上,首先去github上New repository,然后通过git remote add origin则可以添加都远程仓库了

1
2
3
4
5
6
7
8
$ git remote add origin https://github.com/github-xixiwan/test.git

$ git remote
origin

$ git remote -v
origin https://github.com/github-xixiwan/test.git (fetch)
origin https://github.com/github-xixiwan/test.git (push)

这样我们就绑定了远程仓库了,(push)说明我们有权限推送到远程仓库了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git branch
* dev
feature-report
master

$ git branch -d feature-report
error: The branch 'feature-report' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-report'.

$ git branch -D feature-report
Deleted branch feature-report (was e0c2860).

$ git branch
* dev
master

推送到远程仓库的时候有两种情况,第一种就是创建的时候远程仓库是空的,第二种是不是空的,首先来讲第一种

1
2
3
$ git push -u origin master
Everything up-to-date
Branch 'master' set up to track remote branch 'master' from 'origin'.

这样就可以推送到远程仓库了,注意-u参数,git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,下面是第二种远程仓库不是空的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ git branch --set-upstream-to=origin/master master
Branch 'master' set up to track remote branch 'master' from 'origin'.

$ git pull --allow-unrelated-histories
Merge made by the 'recursive' strategy.
README.md | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 README.md

$ git push
Enumerating objects: 49, done.
Counting objects: 100% (49/49), done.
Delta compression using up to 4 threads
Compressing objects: 100% (34/34), done.
Writing objects: 100% (48/48), 4.52 KiB | 925.00 KiB/s, done.
Total 48 (delta 14), reused 0 (delta 0)
remote: Resolving deltas: 100% (14/14), done.
To https://github.com/github-xixiwan/test.git
4da78f7..f01d368 master -> master

可能还会有别的情况,git会有详细提示,大家可以根据提示操作

  • 远程仓库克隆到本地

比如我们要开始一个新项目,首先创建了远程仓库,需要把远程仓库克隆到本地,一样的首先在github上创建New repository

1
2
3
4
5
6
7
$ git clone https://github.com/github-xixiwan/test.git
Cloning into 'test'...
remote: Enumerating objects: 51, done.
remote: Counting objects: 100% (51/51), done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 51 (delta 14), reused 48 (delta 14), pack-reused 0
Unpacking objects: 100% (51/51), done.
  • 标签管理

标签可以相当于是版本号,每个版本都可以创建一个标签

1
2
3
4
5
6
7
$ git branch
* master

$ git tag v1.0.0

$ git tag
v1.0.0

这种是实时打标签,如果想打上上次提交的时候就通过commit id

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
$ git log
commit f01d368f1b0098e07ba4aa4c0fea778e3f9debc2 (HEAD -> master, tag: v1.0.0, origin/master, origin/HEAD)
Merge: 20d1474 4da78f7
Author: xixiwan <liaoxiting2011@163.com>
Date: Sat Oct 13 15:24:07 2018 +0800

Merge branch 'master' of https://github.com/github-xixiwan/test

commit 20d1474c11a8c937e8893e805f0befeb5bf292d8
Merge: 3b723ea c967f0b
Author: xixiwan <liaoxiting2011@163.com>
Date: Sat Oct 13 15:06:14 2018 +0800

新功能已完成

commit 4da78f771cb9df2e10b1e69340dea523cf1fb35d
Author: 喜喜玩 <42362352+github-xixiwan@users.noreply.github.com>
Date: Sat Oct 13 14:44:48 2018 +0800

Initial commit

commit c967f0b77cf5ca6a38a2ba858aca22787bd5c3e0
Author: xixiwan <liaoxiting2011@163.com>
:...skipping...
commit f01d368f1b0098e07ba4aa4c0fea778e3f9debc2 (HEAD -> master, tag: v1.0.0, origin/master, origin/HEAD)
Merge: 20d1474 4da78f7
Author: xixiwan <liaoxiting2011@163.com>
Date: Sat Oct 13 15:24:07 2018 +0800

Merge branch 'master' of https://github.com/github-xixiwan/test

commit 20d1474c11a8c937e8893e805f0befeb5bf292d8
Merge: 3b723ea c967f0b
Author: xixiwan <liaoxiting2011@163.com>
Date: Sat Oct 13 15:06:14 2018 +0800

新功能已完成

$ git tag v0.0.9 20d1474c11a8c937e8893e805f0befeb5bf292d8

$ git tag
v0.0.9
v1.0.0

$ git show v0.0.9
commit 20d1474c11a8c937e8893e805f0befeb5bf292d8 (tag: v0.0.9)
Merge: 3b723ea c967f0b
Author: xixiwan <liaoxiting2011@163.com>
Date: Sat Oct 13 15:06:14 2018 +0800

新功能已完成

diff --cc readme.txt
index a2d84db,d041e86..a3838f9
--- a/readme.txt
+++ b/readme.txt
@@@ -11,4 -11,6 +11,6 @@@ git diff readme.tx

dev分支增加内容 分支上修改内容 master分支上也修改了这行

-禁用--no-ff
+禁用--no-ff 修复issue-1007
+
+ 新功能开发中...

$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/github-xixiwan/test.git
* [new tag] v0.0.9 -> v0.0.9
* [new tag] v1.0.0 -> v1.0.0

$ git tag -d v0.0.9
Deleted tag 'v0.0.9' (was 20d1474)

$ git push origin :refs/tags/v0.0.9
To https://github.com/github-xixiwan/test.git
- [deleted] v0.0.9

git show可以看到这个标签的详细信息,git tag -a v1.0.0 -m "标签说明"也可以添加标签说明,git push origin --tags可以把所有的标签推送到远程仓库,也可以单独推送一个git push origin v1.0.0git tag -d v0.0.9删除本地标签,git push origin :refs/tags/v0.0.9删除远程仓库标签

坚持原创技术分享,您的支持将鼓励我继续创作!