sunxin's Studio.

Git学习

字数统计: 2.4k阅读时长: 10 min
2018/09/08 Share

Git的使用

基础操作

  • git init 初始化一个仓库
  • git add readme.txt 添加一个文件到版本控制
  • git commit -m “add a readme file” 提交文件并添加一个说明
  • git status 查看仓库的当前状态,下面的命令告诉我们,readme文件被修改了,但是还没有提交。
1
2
3
4
5
6
7
8
9
10
11
12
PS D:\learngit> 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 diff readme.txt 查看具体修改内容,13,14行表名了文档内容修改部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PS D:\learngit> git diff readme.txt

diff --git a/readme.txt b/readme.txt

index d8036c1..7b4104a 100644

--- a/readme.txt

+++ b/readme.txt

@@ -1,2 +1,2 @@

-Git is a version control system.
+Git is a distributed version control system.

Git is free software.

\ No newline at end of file
  • git log (–pretty=oneline) 显示从最近到最远的提交日志,一行显示。前面的一长串字母加数字的组合是SHA1值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PS D:\learngit> git log
commit 7e4d2e7ca2c64acba9d4580112f2d111681ae30e
Author: Sunxin <sunxin0630@gmail.com>
Date: Wed Jun 28 16:53:17 2017 +0800

append GPL

commit 8ba42d2299510a66489741269a789e9a3fa31691
Author: Sunxin <sunxin0630@gmail.com>
Date: Wed Jun 28 16:51:36 2017 +0800

add distributed

commit 67ae9c91bce5b91e54a722d091f13c1de425b9a3
Author: Sunxin <sunxin0630@gmail.com>
Date: Wed Jun 28 16:36:25 2017 +0800

wrote a readme file

PS D:\learngit> git log --pretty=oneline
7e4d2e7ca2c64acba9d4580112f2d111681ae30e append GPL
8ba42d2299510a66489741269a789e9a3fa31691 add distributed
67ae9c91bce5b91e54a722d091f13c1de425b9a3 wrote a readme file

版本回退

  • git reset –hard HEAD^ 回退到上一个版本,在git中HEAD代表当前版本,HEAD^代表上个版本,HEAD^^代表上上个版本,HEAD是一个指针
1
2
3
4
5
PS D:\learngit> git reset --hard HEAD^
HEAD is now at 8ba42d2 add distributed
PS D:\learngit> cat readme.txt
Git is a distributed version control system.
Git is free software.
  • git reset –hard 7e4d2e7 回退过版本之后又后悔了,想要回去怎么办,只需要记着原来的commit id即可,这样就可以指定回到未来的某个版本
1
2
3
4
5
PS D:\learngit> git reset --hard 7e4d2e7
HEAD is now at 7e4d2e7 append GPL
PS D:\learngit> cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
  • git reflog 想要回到未来却找不到commit id怎么办,此命令用来记录用户操作的每一次命令,这样就可以找到每一次操作的commit id了。
1
2
3
4
5
6
PS D:\learngit> git reflog
7e4d2e7 HEAD@{0}: reset: moving to 7e4d2e7
8ba42d2 HEAD@{1}: reset: moving to HEAD^
7e4d2e7 HEAD@{2}: commit: append GPL
8ba42d2 HEAD@{3}: commit: add distributed
67ae9c9 HEAD@{4}: commit (initial): wrote a readme file

工作区和暂存区

工作区(Working Directory):能看到的一个目录

暂存区(stage):隐藏目录不算工作区,而是版本库,版本库中存放着名为stage or index 的暂存区,还有git自动为我们创建的第一个分支master,以及指向master的一个指针HEAD

  • git add 是把文件添加进去,实际上就是把文件修改添加到暂存区
  • git commit 提交更改,实际上就是把暂存区的文件提交到当前分支

管理修改

为什么Git比其他版本控制系统设计的优秀?因为git跟踪管理的是文件的修改,而非文件。

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

  • git diff HEAD – readme.txt 查看工作去和版本库里面最新版本的区别

撤销修改

  • git checkout – readme.txt 当修改了工作区的某个文件的内容,想直接丢弃工作区的修改时使用。
  • git reset HEAD readme.txt 当修改了工作区的某个文件内容并且添加到了暂存区,使用该命令就可以回到添加暂存区之前,然后使用第一个命令就可以撤销修改。
  • 如果已经把修改commit,想要撤销修改,可以进行版本回退,前提是没有提交远程仓库。

删除文件

  • 在工作区删除了一个已经提交到仓库的文件,可能有两种情况:

    • 误删,这时候就要工作区和版本库就不一致了,可以把误删的文件恢复

      git checkout -- test.txt 用版本库里面的版本替换工作区的版本,一键还原

    • 真的想删除该文件

      git rm test.txt

      git commit -m "remove test.txt"

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


分支管理

使用情景:

​ 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

分支的切换时使用HEAD指针,所以git切换分支速度很快。


创建与合并分支

  • git branch 查看分支
  • git branch <name> 创建分支
  • git checkout <name> 切换分支
  • git checkout -b <name> 创建+切换分支
  • git merge <name> 合并某分支到当前分支
  • git branch -d <name> 删除分支

解决冲突

当两个分支修改了文件的同一个地方并且都分别有了新的提交,在这种情况下,Git无法执行“快速合并”,只能试图把新的提交合并起来,这样就可能造成冲突。我们必须手动解决冲突之后再提交,git status 也可以查看冲突的文件

1
2
3
4
5
6
7
8
9
10
11
PS D:\learngit> git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")

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")

也可以直接查看源文件

1
2
3
4
5
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
Creating a new branch is quick AND simple.
  • 查看分支合并图
1
2
3
4
5
6
7
8
9
PS D:\learngit> git log --graph --pretty=oneline --abbrev-commit
* 2b7d8c2 conflict fixed
|\
| * f8cde07 AND simple
* | ec07ee4 & simple
|/
* 0057b61 branch test
* 5fc1cd2 remove test.txt
* e1161a9 add a test file

分支策略

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

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:

git-br-policy

  • 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

Bug分支

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

Feature分支

当需要开发一个新功能的时候,最好开一个Feature分支进行开发。在上面开发完成,合并,最后删除Feature分支。

  • git branch -D name丢弃一个没有被合并过的分支

多人协作

  • git remote 查看远程库的信息
  • git remote -v 显示更详细的信息
推送分支

把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上

  • git push origin master
  • git push origin dev
抓取分支
  • git pull 把最新的提交从仓库中抓取下来

多人协作的工作模式:

  1. 首先,可以试图用git push origin branch-name推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name


标签管理(tag)

用来为发布的正式版打上版本号

  • git tag v1.0 在master分支上打tag,默认tag是打在最新提交的commit上。
  • git tag v0.8 commit id 如果忘了打标签,可以使用commit id找到历史提交,再去打标签。
1
2
3
4
PS D:\learngit> git tag v0.9 ac3f8e4
PS D:\learngit> git tag
v0.8
v1.0
  • git show v0.9查看标签信息
  • git tag -a v0.1 -m "version 0.1 released" 67ae9c9 创建一个带有说明的标签
  • 命令git push origin <tagname>可以推送一个本地标签;
  • 命令git push origin --tags可以推送全部未推送过的本地标签;
  • 命令git tag -d <tagname>可以删除一个本地标签;
  • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
CATALOG
  1. 1. Git的使用
    1. 1.1. 基础操作
      1. 1.1.1. 版本回退
      2. 1.1.2. 工作区和暂存区
      3. 1.1.3. 管理修改
      4. 1.1.4. 撤销修改
      5. 1.1.5. 删除文件
    2. 1.2. 分支管理
      1. 1.2.1. 创建与合并分支
      2. 1.2.2. 解决冲突
      3. 1.2.3. 分支策略
      4. 1.2.4. Bug分支
      5. 1.2.5. Feature分支
      6. 1.2.6. 多人协作
        1. 1.2.6.1. 推送分支
        2. 1.2.6.2. 抓取分支
    3. 1.3. 标签管理(tag)