本文是《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 diff
与cat
的区别?
- diff : 显示同个文件前后两次的差异;
- cat : 显示修改后的文件的全部内容 ;
2.5 回退指定的文件至最近一次修改的版本
2.4.1 执行
cat readme.txt
cc
bbbbbbbbb2.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.txt2.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 clean2.6.7 在2.6.4之后,如果之前add的文件不想提交,可根据2.6.4中的提示取消之前添加的文件;
$ git reset HEAD readme.txt
(把暂存区的修改撤销掉(unstage),重新放回工作区;)Unstaged changes after reset:
M readme.txt2.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
修改第一行数据为cccommit 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
修改第一行数据为cccommit 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
问题锦集
- 出现的问题
$ 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文件