Git回顾

2017-05-06

Git回顾

[TOC]

小总结

1
2
3
4
5
6
7
8
9
10
11
[分支管理]
git branch 查看分支
git branch <name> 创建分支
git checkout <name> 切换分支
git checkout -b <name> 创建并切换分支
git branch -d <name> 删除分支
$ git merge --no-ff -m "合并信息" dev03 快速合并并保留合并记录--no-ff

[提交&&克隆]
$ git push -u origin master push到远方
$ git clone https://github.com/dony15/Evolution.git clone到本地

1.IDEA整合Git使用

1-1. 在本机指定的地方,用来git命令clone远程代码(首次即可)

1-2.安装好git,添加Git的启动文件到IDEA

1-3.用IDEA打开clone代码,并重新标记

1-4.此时运行代码,提示没有指定编译路径的信息

(随便创建一个out之类的文件夹)

1-5.点击ok,将编译路径指向该文件夹,即可运行


[SUCCESS]此时代码拉取的基础操作我们就已经完成了

1-6.Idea中用Git管理代码的各种操作

(注意上图误区,并非只提交SRC即可,手误)

  1. 关于提交内容,根据具体业务,像 源,依赖配置信息,资源,依赖工程,引用jar文件,配置文件等一般需要上传
  2. 而开发工具配置信息,运行编译文件等不需要上传

2.简单的流程回顾

创建一个版本库

2-1.创建仓库

A)选择一个合适的地方,创建一个空目录:

1
2
3
4
5
6
7
-----------------[Instruction]------------------
$ mkdir learngit
$ cd learngit
$ pwd

-------------------[Prompt]--------------------
/Users/michael/learngit

B)通过git init命令把这个目录变成Git可以管理的仓库:(初始化)

1
2
3
4
5
-----------------[Instruction]------------------
$ git init

-------------------[Prompt]--------------------
Initialized empty Git repository in /Users/michael/learngit/.git/

如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

2-2.上传到仓库

A)添加文件到仓库(实例readme.txt)(存放位置learngit(或者子目录下))

1
$ git add readme.txt  //添加到到本地暂存区

B)完成上传

1
2
3
4
5
6
7
-----------------[Instruction]------------------
$ git commit -m "read a new file" //把暂存区的内容提交到当前本地分支

-------------------[Prompt]--------------------
[master (root-commit) aca27e4] read a new file
1 file changed, 1 insertion(+)
create mode 100644 readme.txt

一个文件被改动,插入一行记录

总结AB上传示例

1
2
3
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

使用命令git add <file>,可反复多次使用,添加多个文件

使用命令git commit -m <message>,完成上传

2-3.查看工作区内容

A)查看工作区被修改的文件(为了测试,提前修改未添加和提交)

1
2
3
4
5
6
7
8
9
10
11
12
13
-----------------[Instruction]------------------
$ git status

-------------------[Prompt]--------------------
On branch master
Changes not staged for commit: //修改了尚未提交的内容
(use "git add <file>..." to update what will be committed) //使用add添加要更新的内容
(use "git checkout -- <file>..." to discard changes in working directory) //使用checkout --放弃对文件的修改

modified: readme.txt //修改文件 readme.txt

no changes added to commit (use "git add" and/or "git commit -a")
//没有为提交添加任何更改(使用“git添加”和/或“git commit -a”)

B)查看详细的更改内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-----------------[Instruction]------------------
$ git diff readme.txt

-------------------[Prompt]--------------------
diff --git a/readme.txt b/readme.txt
index c2ed1e8..90f0f33 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,3 @@
-Hello Word
\ No newline at end of file
+This This command is to update the file.
+This is the second update.
+This is the last update record.
\ No newline at end of file

C)查看后重新上传到仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-----------------[Instruction]------------------
$ git add readme.txt

-----------------[Instruction]------------------
$ git commit -m "add new readme"

-------------------[Prompt]--------------------
[master 62c622f] add new readme
1 file changed, 3 insertions(+), 1 deletion(-)

-----------------[Instruction]------------------
$ git status

-------------------[Prompt]--------------------
On branch master
nothing to commit, working tree clean //此时没有未提交的数据了和修改的

2-4.版本回退

再次对readme.txt进行修改后测试

A)添加提交

1
2
3
4
5
6
7
8
9
-----------------[Instruction]------------------
$ git add readme.txt

-----------------[Instruction]------------------
$ git commit -m "The third test is on"

-------------------[Prompt]--------------------
[master 03b3138] The third test is on
1 file changed, 2 insertions(+), 3 deletions(-)

B)查看详细更新日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-----------------[Instruction]------------------
$ git log

-------------------[Prompt]--------------------
commit 03b3138b888b688ea429ccd860c5e84a3db4efa2 //commit id(版本号),使用sha-1生成16进制防冲突
Author: DonY15 <37318228+625432639@users.noreply.github.com> //作者
Date: Thu Aug 9 19:59:10 2018 +0800 //更新时间

The third test is on //-m 后的更新提醒

commit 62c622fc4d32bd081a5f0ea80bc501b9a97c3079
Author: DonY15 <37318228+625432639@users.noreply.github.com>
Date: Thu Aug 9 19:53:04 2018 +0800

add new readme

commit aca27e458ca3aa8492778bca7ab125815ddbbd5e
Author: DonY15 <37318228+625432639@users.noreply.github.com>
Date: Thu Aug 9 19:24:19 2018 +0800

read a new file

C)如果详细更新日志过于繁琐,可以查看精简版

1
2
3
4
5
6
7
-----------------[Instruction]------------------
$ git log --pretty=oneline

-------------------[Prompt]--------------------
03b3138b888b688ea429ccd860c5e84a3db4efa2 The third test is on //这是-m 后面的更新提示,倒序展示
62c622fc4d32bd081a5f0ea80bc501b9a97c3079 add new readme
aca27e458ca3aa8492778bca7ab125815ddbbd5e read a new file

D)开始版本退回!

git reset 重置命令

1
2
3
4
5
-----------------[Instruction]------------------
$ git reset --hard HEAD^

-------------------[Prompt]--------------------
HEAD is now at 62c622f add new readme

注意 HEAD是表示当前的版本,也就是最新提交的版本,

上一个版本就是HEAD^

上上个版本是HEAD^^

当版本多时,可以用HEAD~100 来退回到100个版本以前

查看该文件,此时已经退回到上个版本

1
2
3
4
5
6
7
-----------------[Instruction]------------------
$ cat readme.txt

-------------------[Prompt]--------------------
This This command is to update the file.
This is the second update.
This is the last update record.

2-5.版本前进

版本回退后将不显示最新的版本

可以通过重置指令再回到最新版本

A)前提是git窗口没有关闭,且能找到之前最新的commit id

1
2
3
4
5
-----------------[Instruction]------------------
$ git reset --hard 03b3138b888b688ea429ccd860c5e84a3db4efa2 //id可以不用写完整,写到不重复即可

-------------------[Prompt]--------------------
HEAD is now at 03b3138 The third test is on

此时版本已经前进到指定的新版本了

B)当无法再当前窗口找到commit id时,如第二天以后

1
2
3
4
5
6
7
8
9
-----------------[Instruction]------------------
$ git reflog 查看指令历史

-------------------[Prompt]--------------------
03b3138 HEAD@{0}: reset: moving to 03b3138b888b688ea429ccd860c5e84a3db4efa2
62c622f HEAD@{1}: reset: moving to HEAD^
03b3138 HEAD@{2}: commit: The third test is on
62c622f HEAD@{3}: commit: add new readme
aca27e4 HEAD@{4}: commit (initial): read a new file

通过此方法也可以查到commit id 前缀,通过前缀即可查找到指定版本

2-51.工作区和暂存区概念测试

A)对readme.txt修改,创建LICENSE (对比两种状态)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-----------------[Instruction]------------------
//创建一个文本文件,写点东西
$ vim LICENSE

-----------------[Instruction]------------------
//查看状态
$ git status

-------------------[Prompt]--------------------
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

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

LICENSE

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

此时提醒,readme的修改状态已经被管理检测到修改,但是没有添加到暂存区

而LICENSE则属于Untracked状态,从来没有被add添加过

B)执行两次add添加到暂存区 && 执行commit命令将暂存区内容上传到当前本地分支

1
2
3
4
5
6
7
8
9
-----------------[Instruction]------------------
$ git add readme.txt
$ git add LICENSE
$ git commit -m "The staging area to the workspace"

-------------------[Prompt]--------------------
[master 13853f9] The staging area to the workspace
2 files changed, 2 insertions(+), 2 deletions(-)
create mode 100644 LICENSE


所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

C)执行git status再次查看工作区修改状态

1
2
3
4
5
6
-----------------[Instruction]------------------
$ git status

-------------------[Prompt]--------------------
On branch master
nothing to commit, working tree clean


一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的

2-6.Git的跟踪修改

每次修改,如果不用git add到暂存区,那就不会加入到commit中,如:

  1. 第一次修改readme.txt
  2. 第一次add readme.txt
  3. 第二次修改readme.txt
  4. commit提交

此时,第二次的修改便不会生效,如果想生效,继续add readme.txt再commit提交即可

正常情况下也可以这样操作:

  1. 第一次修改readme.txt
  2. 第二次修改readme.txt
  3. 第一次add readme.txt
  4. commit提交

所有的数据则会被提交到本地分支

1-7.Git的修改

  1. 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
  2. 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,
    1. 第一步用命令git reset HEAD <file>,就回到了1,
    2. 第二步按1操作。
  3. 已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退,不过前提是没有推送到远程库。

2-8.删除文件

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

3.远程仓库操作

3-1.搭建远程仓库通道

A)创建SSH Key

1
$ ssh-keygen -t rsa -C "youremail@example.com"

B)GitHub添加公钥

3-2.创建/关联远程仓库

A)GitHub上创建一个仓库(略)

B)关联这个远程仓库(需要输入账号和密码)

1
$ git remote add origin https://github.com/dony15/Evolution.git

origin 是默认远程仓库的意思,可以修改

C)首次推送远端需要加-u

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-----------------[Instruction]------------------
$ git push -u origin master

-------------------[Prompt]--------------------
Fatal: HttpRequestException encountered.
Username for 'https://github.com': 625432639@qq.com
Counting objects: 13, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (13/13), 1.06 KiB | 0 bytes/s, done.
Total 13 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/dony15/Evolution.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.

以后推送这样就可以

1
$ git push origin master

3-3.克隆到本地

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-----------------[Instruction]------------------
$ git clone https://github.com/dony15/Evolution.git

-------------------[Prompt]--------------------
Cloning into 'Evolution'...
remote: Counting objects: 13, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 13 (delta 1), reused 13 (delta 1), pack-reused 0
Unpacking objects: 100% (13/13), done.

-----------------[Instruction]------------------
$ cd Evolution/
$ ls

-------------------[Prompt]--------------------
LICENSE readme.txt

4.分支操作管理

1
2
3
4
5
6
7
8
9
10
11
查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

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

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

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

5.解决分支冲突

A)测试创建分支dev02,并修改提交readme.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-----------------[Instruction]------------------
$ git checkout -b dev02 //创建并切换到dev02分支上

-------------------[Prompt]--------------------
Switched to a new branch 'dev02'


-----------------[Instruction]------------------
$ git branch //查看分支

-------------------[Prompt]--------------------
dev01
* dev02 //此时使用分支已经切换到dev02
master

-----------------[Instruction]------------------
$ git add readme.txt
$ git commit -m "add Branch file A" //修改readme.txt后提交

-------------------[Prompt]--------------------
[dev02 2a625ef] add chongtu
1 file changed, 2 insertions(+), 1 deletion(-)

B)master中修改提交readme.txt

1
2
3
4
5
6
7
-----------------[Instruction]------------------
$ git add readme.txt

$ git commit -m "add Principal branch of conflict"
-------------------[Prompt]--------------------
[master 59dea59] add Principal branch of conflict
1 file changed, 2 insertions(+), 1 deletion(-)

C)合并分支和master的代码$ git merge dev02

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
-----------------[Instruction]------------------
$ git merge dev02 //git的快速合并命令

-------------------[Prompt]--------------------
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt //提示readme.txt合并冲突
Automatic merge failed; fix conflicts and then commit the result. //自动合并失败;修复冲突,然后提交结果。

-----------------[Instruction]------------------
$ git status //使用查看状态来查看详细问题

-------------------[Prompt]--------------------
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
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")

-----------------[Instruction]------------------
$ git diff readme.txt //查看详细分支修改内容

-------------------[Prompt]--------------------
diff --cc readme.txt
index 6b4e414,73c648e..0000000
--- a/readme.txt
+++ b/readme.txt
@@@ -1,2 -1,2 +1,6 @@@
Workspaces and staging areas
- 合并分支测试-主分支
-测试分支,解决分支冲突问题
++<<<<<<< HEAD //master的修改内容
++合并分支测试-主分支
++======= //分割线的
++测试分支,解决分支冲突问题
++>>>>>>> dev02 //dev02的修改内容
-------------------[Prompt]--------------------
注意此时本地文件readme.txt中的内容也为改成响应的两套
Workspaces and staging areas
<<<<<<< HEAD
合并分支测试-主分支
=======
测试分支,解决分支冲突问题
>>>>>>> dev02

这种情况下git无法使用git merge进行快速合并,则出现冲突问题

D)删除指定的冲突后提交

1
2
3
4
5
6
-----------------[Instruction]------------------
$ git add readme.txt
$ git commit -m "第二次合并"

-------------------[Prompt]--------------------
[master ae51c0e] 第二次合并 //此时冲突文件即可进行合并

E)查看时间轴$ git log --graph --pretty=oneline --abbrev-commit

1
2
3
4
5
6
7
8
9
10
11
12
13
-----------------[Instruction]------------------
$ git log --graph --pretty=oneline --abbrev-commit

-------------------[Prompt]--------------------
* ae51c0e 第二次合并
|\
| * 2a625ef add chongtu
* | 59dea59 add Principal branch of conflict
|/
* 13853f9 The staging area to the workspace
* 03b3138 The third test is on
* 62c622f add new readme
* aca27e4 read a new file

F)最后合并完,删除分支即可

1
2
3
4
5
-----------------[Instruction]------------------
$ git branch -d dev02 //删除分支

-------------------[Prompt]--------------------
Deleted branch dev02 (was 2a625ef).

6.分支管理策略

使用–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
-----------------[Instruction]------------------
$ git checkout -b dev03
$ git add readme.txt //注意添加的是新修改的readme.txt 如果未修改则无法commit提交哦
$ git commit -m "add readme.txt to dev03"

$ git checkout master //切换回主分支

$ git merge --no-ff -m "merge with no-ff" dev03 //合并分支
$ git log --graph --pretty=oneline --abbrev-commit //查看分支详细流程日志
-------------------[Prompt]--------------------
* c7562a6 merge with no-ff
|\
| * 1a027fc add merge 2
|/
* ae51c0e 第二次合并
|\
| * 2a625ef add chongtu
* | 59dea59 add Principal branch of conflict
|/
* 13853f9 The staging area to the workspace
* 03b3138 The third test is on
* 62c622f add new readme
* aca27e4 read a new file

7.多人协作流程回顾

(待更新)

8.标签管理

(待更新)

9.自定义Git

(待更新)