Git的使用 - Go语言中文社区

Git的使用


本文是《Git教程》的学习笔记


准备工作:安装Git。

一、新建一个项目存储到仓库

1.1 创建文件夹 –>mkdir 文件夹名

$ mkdir git_demo

1.2 进入到指定的文件夹下–>cd 文件夹名

$ cd git_demo

1.3 显示当前所在的绝对路径

$ pwd

/c/Users/Administrator/Desktop/git_demo

1.4 初始化仓库–>git init

$ git init

Initialized empty Git repository in C:/Users/Administrator/git_demo/.git/

1.5 下有一个.git的隐藏文件夹,如果想看到,可以使用ls -ah命令

$ ls -ah

./ ../ .git/

1.6 提交文件共2步:

  • 1.6.1 将要提交的文件选中,准备提交 –>git add 文件名.后缀
    $ git add readme.txt //执行这个命令,如没有任何显示,则说明添加成功;

  • 1.6.2 提交选中的文件 –>git commit -m “对提交代码的描述性文字”
    $ git commit -m "添加一个readme文件"

    [master (root-commit) 1b60c44] 添加一个readme文件
    1 file changed, 2 insertions(+) –> //有一个文件改变,插入了两行内容;
    create mode 100644 readme.txt

1.7 是否可以一次性add多个文件? –>可以

$ git add file1.txt –> //可以分两次add;
$ git add file2.txt file3.txt –> //可以一次add多个文件,中间用空格分开;
$ git commit -m "add 3 files" –> //一次性添加3个文件

二、仓库状态查看

readme.txt文件的原内容 :

aaaaa
bbbbbbbbb

现将内容更改为 :

cc
bbbbbbbbb

2.1 查看当前仓库中文件是否有更改

$ git status

On branch master
Changes not staged for commit:
(use “git add …” to update what will be committed)  –>可以使用git add 文件名.后缀
(use “git checkout – …” to discard changes in working directory)  –>可以使用git checkout 文件名.后缀
modified: readme.txt –>存在修改的文件
no changes added to commit (use “git add” and/or “git commit -a”)

2.2 查看指定文件的内容与上个版本的区别

$ git diff

diff –git a/readme.txt b/readme.txt
index 937176d..c92da49 100644
— a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-aaaaa - - -> 删除(-)
+cc - - ->新增(+)
bbbbbbbbb
No newline at end of file

2.3 可以查看指定文件的内容? –>可以

$ cat readme.txt

cc
bbbbbbbbb //readme.txt文件中的内容;

2.4 diffcat 的区别?

  • diff : 显示同个文件前后两次的差异;
  • cat : 显示修改后的文件的全部内容 ;

2.5 回退指定的文件至最近一次修改的版本

  • 2.4.1 执行cat readme.txt

    cc
    bbbbbbbbb

  • 2.4.2 git checkout -- readme.txt

    aaaaa
    bbbbbbbbb

2.6 提交流程

  • 2.6.1 执行git status,查看是否有修改的文件 ;
  • 2.6.2 若有修改,则执行git diff 文件名.后缀 ,查看修改的地方是否正确;
  • 2.6.3 若修改的地方都是要提交的,则执行git add 文件名.后缀
  • 2.6.4 执行git status,查看返回的数据是否为如下所示 :

    $ git status
    On branch master
    Changes to be committed:
    (use “git reset HEAD …” to unstage)
    modified: readme.txt

  • 2.6.5 执行$ git commit -m "修改第一行数据为cc"

    [master 5f1b84c] 修改第一行数据为cc
    1 file changed, 1 insertion(+), 1 deletion(-)  –>有一个文件发生改变,插入一样,删除一行

  • 2.6.6 提交完毕后,执行git status

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

  • 2.6.7 在2.6.4之后,如果之前add的文件不想提交,可根据2.6.4中的提示取消之前添加的文件;
    $ git reset HEAD readme.txt(把暂存区的修改撤销掉(unstage),重新放回工作区;)

    Unstaged changes after reset:
    M readme.txt

  • 2.6.8 在2.6.7之后执行git status,返回如下结果则说明之前add的文件已经取消;

    On branch master
    Changes not staged for commit:
    (use “git add …” to update what will be committed)
    (use “git checkout – …” to discard changes in working directory)
    modified: readme.txt
    no changes added to commit (use “git add” and/or “git commit -a”)

三、版本回退

一般版本回退需要知道之前的版本号,可以通过git log 查看

3.1 提交的日志查看

$ git log

commit 5f1b84cb3f218473014cf17361d36e449256dded  –>(第二次提交的)
Author: Elson aaa@163.com
Date: Sat Jul 30 00:37:25 2016 +0800
修改第一行数据为cc

commit 1b60c443b4763eef7ed2e51157d75954051a6883  –>(第一次提交的)
Author: Elson aaa@163.com
Date: Fri Jul 29 23:40:40 2016 +0800
添加一个readme文件

$ git log -num 数字num表示最近num次提交的log,此处num=1

commit 5f1b84cb3f218473014cf17361d36e449256dded  –>(第二次提交的)
Author: Elson aaa@163.com
Date: Sat Jul 30 00:37:25 2016 +0800
修改第一行数据为cc

3.2 如何简化显示的内容?

$ git log --pretty=oneline 单行显示

5f1b84cb3f218473014cf17361d36e449256dded 修改第一行数据为cc
1b60c443b4763eef7ed2e51157d75954051a6883 添加一个readme文件

注: 5f1b8…6dded 这一串字符是commit id(版本号),是一个SHA1计算出来的一个非常大的数字,用十六进制表示,相当与SVN上面的version1,2,3;

3.3 为什么不使用1,2,3作版本号?

因为Git是分布式的版本控制系统,若多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,则会引起版本号冲突。

3.4 回退版本

$ git reset --hard HEAD^

HEAD is now at 1b60c44 添加一个readme文件 —>指针现在指向版本号为1b60c44的版本(参照3.1);

此时执行 $ git log 命令,只看到当前指针以前的log日志;

commit 1b60c443b4763eef7ed2e51157d75954051a6883
Author: Elson aaa@163.com
Date: Fri Jul 29 23:40:40 2016 +0800
添加一个readme文件

类型 表示的意思
HEAD 表示当前版本,也就是最新提交的版本;
HEAD^ 表示上一个版本;
HEAD^^ 表示上上一个版本;
HEAD~20 表示往上20个版本;

注:
- HEAD指哪,当前commit就是哪;
- –hard就是用版本库的内容覆盖本地;

3.5 如何撤销之前的回退操作呢?(git reset –hard 需要还原的版本号)

$ git reset --hard 5f1b84c

HEAD is now at 5f1b84c 修改第一行数据为cc

此时执行 $ git log 命令,结果与3.1相同,说明撤销回退的操作成功;

commit 5f1b84cb3f218473014cf17361d36e449256dded
Author: Elson aaa@163.com
Date: Sat Jul 30 00:37:25 2016 +0800
修改第一行数据为cc

commit 1b60c443b4763eef7ed2e51157d75954051a6883
Author: Elson aaa@163.com
Date: Fri Jul 29 23:40:40 2016 +0800
添加一个readme文件

3.6 如何获取3.5中需要的版本号呢?

  • 3.6.1 如果窗口未关闭,则可以在窗口内查找到回退之前的版本,即3.1的内容;
  • 3.6.2 如果窗口关闭,可以通过git reflog 查找之前所有的操作;
    $ git reflog

    5f1b84c HEAD@{0}: reset: moving to 5f1b84c
    1b60c44 HEAD@{1}: reset: moving to HEAD^
    5f1b84c HEAD@{2}: commit: 修改第一行数据为cc
    1b60c44 HEAD@{3}: commit (initial): 添加一个readme文件

    版本号 指针位置 操作类型 执行的操作
    5f1b84c HEAD@{2} commit 修改第一行数据为cc

    根据返回的数据,可以找到我们所需的版本号;

    文本内容 意义
    5f1b84c HEAD@{0}: reset: moving to 5f1b84c moving to 5f1b84c: 指针移动到指定的版本(5f1b84c)
    1b60c44 HEAD@{1}: reset: moving to HEAD^ moving to HEAD^: 指针移动到上一个版本
    5f1b84c HEAD@{2}: commit: 修改第一行数据为cc commit: 修改第一行数据为cc: 提交代码
    1b60c44 HEAD@{3}: commit (initial): 添加一个readme文件 commit(initial): 第一次提交

四、工作区和暂存区

这里写图片描述
具体请参照《工作区和暂存区》

五、管理修改

5.1 查看工作区和版本库里面最新版本的区别

git diff HEAD -- readme.txt

diff –git a/readme.txt b/readme.txt
index c92da49..a721081 100644
— a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,4 @@
cc
-bbbbbbbbb
No newline at end of file
+bbbbbbbbb
+
+ffff

六、撤销修改

6.1 丢弃工作区域的修改

git checkout -- file

意义:把readme.txt文件在工作区的修改全部撤销,有两种情况:

  • 6.1.1 readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
  • 6.1.2 readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

操作指令 含义
git checkout name 切换到另一个分支
git checkout – file 撤销工作区指定文件的修改

6.2 把暂存区的修改撤销掉(unstage),重新放回工作区

git reset HEAD file

6.3 场景模拟

  • 6.3.1 工作区文件有修改,还没提到暂存区时,可以用命令git checkout -- file直接丢弃工作区的修改。
  • 6.3.2 工作区文件有修改,且提到暂存区时,若想丢弃修改,分两步
    • 第一步:git reset HEAD file,回到了场景1;
    • 第二步:git checkout -- file,按场景1操作;
  • 6.3.3 文件已经提交到本地仓库(未提交到远程仓库),若想撤销本次提交,git reset --hard HEAD^

七、删除文件

7.1 直接在文件管理器中把没用的文件删了,或者用rm命令删除

$ rm readme.txt

  • 如果被删除的文件之前提交到本地版本库中,则删除后可通过git checkout -- readme.txt 从仓库中还原回来(注意:–后面要空格);
  • 如果被删除的文件之前没有提交到本地版本库中,则删除后可进入文件夹内按Ctrl+Z还原;

7.2 删除版本库中的文件(流程和添加文件相似)

$ git rm test.txt

rm ‘readme.txt’

$ git commit -m "删除文件"

[master 0f4131f] 删除文件
1 file changed, 3 deletions(-)
delete mode 100644 readme.txt

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


略。。。

十、解决分支合并引起的冲突

这里写图片描述

10.1 常用的命令

用带参数的git log也可以看到分支的合并情况

$ git log --graph --pretty=oneline --abbrev-commit

命令 含义
–graph 可以看到分支合并图
–pretty=oneline 单行显示
–abbrev-commit 版本号显示前几位+提交到文本描述

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容

十一、 分支管理策略

11.1 Fast forward模式和非Fast forward模式的区别?

  • Fast forward模式:这种模式下,删除分支后,会丢掉分支信息。
  • 非Fast forward模式:这种模式下,Git在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

11.2 如何禁止Fast forward模式呢?--no-ff (ff是Fast forward的简写)

$ git merge --no-ff -m "merge with no-ff" dev
本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

11.3 两种模式下合并代码后的效果图?

Fast forward模式,merge后就像这样:
这里写图片描述

非Fast forward模式,merge后就像这样:
这里写图片描述

11.4 删除未合并的分支

git branch -D new_dev

十二、Bug分支

在Git中,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

场景:当接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,当前你正在dev上进行的工作还没有提交,且不能提交;但是,必须在两个小时内修复该bug,怎么办?

幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

12.1 存储当钱的工作空间

$ git stash

Saved working directory and index state WIP on A: 6e86183 add DD(提交时的注释)
HEAD is now at 6e86183 add DD(提交时的注释)

$ git status

On branch A
nothing to commit, working directory clean

12.2 如果不执行git stash ,直接切换回master分支,会怎么样呢?

$ git checkout master

error: Your local changes to the following files would be overwritten by checkou t:
readme.txt
Please, commit your changes or stash them before you can switch branches.
Aborting  (在切换分支之前,请先提交,或暂存之前的修改。)

12.3 如何查看之前的存储记录呢?

$ git stash list

stash@{0}: WIP on A: 6e86183 add DD

12.4 如何还原之前的操作记录?

  • 12.4.1 $ git stash pop

    On branch A
    Changes not staged for commit:
    (use “git add …” to update what will be committed)
    (use “git checkout – …” to discard changes in working directory)
    modified: readme.txt
    no changes added to commit (use “git add” and/or “git commit -a”)
    Dropped refs/stash@{0} (ea857e678ae9b8b65560249a840f1fde6c8fb0b8)   –>和下面对比多了此行

  • 12.4.2 $ git stash apply 不会删除之前stash的记录

    On branch A
    Changes not staged for commit:
    (use “git add …” to update what will be committed)
    (use “git checkout – …” to discard changes in working directory)
    modified: readme.txt
    no changes added to commit (use “git add” and/or “git commit -a”)

  • 12.4.3 $ git stash drop

    Dropped refs/stash@{0} (a552f7c432166140cd44a9a521d13c71cba9c7a2)

注: 12.4.1的操作相当于12.4.2 + 12.4.3

12.5 场景模拟

12.5.1 $ git stash pop模拟

  • 先存储
    $ git stash

    Saved working directory and index state WIP on A: 6e86183 add DD
    HEAD is now at 6e86183 add DD

  • 查看有几个stash
    $ git stash list

    stash@{0}: WIP on A: 6e86183 add DD

  • 还原
    $ git stash pop

    On branch A
    Changes not staged for commit:
    (use “git add …” to update what will be committed)
    (use “git checkout – …” to discard changes in working directory)
    modified: readme.txt
    no changes added to commit (use “git add” and/or “git commit -a”)
    Dropped refs/stash@{0} (ea857e678ae9b8b65560249a840f1fde6c8fb0b8)

  • 查看有几个stash
    $ git stash list

    …空的…

  • 第二次还原
    $ git stash pop

    No stash found.

12.5.2 $ git stash apply模拟

  • 先存储
    $ git stash

    Saved working directory and index state WIP on A: 6e86183 add DD
    HEAD is now at 6e86183 add DD

  • 查看有几个stash
    $ git stash list

    stash@{0}: WIP on A: 6e86183 add DD

  • 还原
    $ git stash apply

    On branch A
    Changes not staged for commit:
    (use “git add …” to update what will be committed)
    (use “git checkout – …” to discard changes in working directory)
    modified: readme.txt
    no changes added to commit (use “git add” and/or “git commit -a”)

  • 查看有几个stash
    $ git stash list

    stash@{0}: WIP on A: 6e86183 A:add DD

  • 第二次还原
    $ git stash apply 会报错
    error: Your local changes to the following files would be overwritten by merge:
    readme.txt
    Please, commit your changes or stash them before you can merge.
    Aborting

  • 删除stash的记录
    $ git stash drop 删除stash的记录

    Dropped refs/stash@{0} (a552f7c432166140cd44a9a521d13c71cba9c7a2)

  • 查看有几个stash
    $ git stash list

    …空的…

十三、多人协作(远程仓库)

13.1

13.2

13.3

十四、创建标签

14.1 新建一个标签

git tag <name> (commit id) 括号内可以省略,则默认为HEAD;

14.2 指定标签信息

git tag -a <tagname> -m "文本描述"

14.3 用PGP签名标签

git tag -s <tagname> -m "文本描述"

14.4 查看所有标签

git tag

十五、操作标签

15.1 推送一个本地标签

git push origin <tagname>

15.2 推送全部未推送过的本地标签

git push origin --tags

15.3 删除一个本地标签

git tag -d <tagname>

15.4 删除一个远程标签

git push origin :refs/tags/<tagname>

十六、忽略特殊文件

16.1 忽略某个未commit的文件:

.gitignore文件中添加需要忽略的文件:

文件.gitignore的格式规范:
A:#为注释
B:可以使用shell所使用的正则表达式来进行模式匹配
C:匹配模式最后跟”/”说明要忽略的是目录
D:使用!取反

16.2 忽略某个已经被commit的文件:

项目中的某个已经被commit的文件,并push到server了,这时要忽略这个文件的提交:
16.2.1: 剔除已提交的文件

文件夹: `git rm -r --cached directory_name`
文 件: `git rm --cached 文件名.后缀名`

16.2.2: 在.gitignore中添加要忽略的文件(配合git status检测)
16.2.3: commit
16.2.4: push

十七、配置别名


其他

输出内容配色

$ git config --global color.ui true


问题锦集


  1. 出现的问题

$ git commit -m “ccc”
fatal: Unable to create ‘C:/Users/Administrator/Desktop/demo/.git/index.lock’: File exists.
Another git process seems to be running in this repository, e.g. an editor opened by ‘git commit’. Please make sure all processes are terminated then try again. If it still fails, a git process may have crashed in this repository earlier: remove the file manually to continue.

解决方案:$ rm -f ./.git/index.lock 或者进入对应.git目录删除index.lock文件



参考:
《Git和GitHub使用总结》
《Git权威指南》
《Git教程》

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Love667767/article/details/51973162
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-08 10:55:39
  • 阅读 ( 1691 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢