git学习笔记
此文章装载自廖雪峰老师,有些部分加上自己的想法,有误的地方希望大家指出来,如果侵权请联系QQ:2196447160删除
创建版本库
新建一个目录
$ mkdir learngit
查看该目录的文件
$ cd learngit
显示当前文件的路径
$ pwd
查看某文件的内容
$ cat readme.txt
将目录变为git可管理的仓库(初始化git仓库)
$ git init
添加文件到仓库中(为什么需要两步:减少版本的迭代次数)
-
将文件放到暂存区
$ git add readme.txt
-
将文件中的内容提交到当前分支(git commit -m “解释所作的更改”)
$ git commit -m "wrote a readme file"
查看以前的修改内容
$ git status
查看工作区的状态(查看工作区与缓存区的区别)
$ git diff
查看历史记录
$ git log
推出查看log状态
在英文状态下输入q
使git版本回退
$ git reset --hard HEAD^^
- git中回退的注意事项
- 回退到上一个版本hard参数为HEAD^
- 回退到上上个版本hard参数为HEAD^^
- 回退到上N个版本hard参数为HEAD后面带N个^
- 回退之间的提交也会回退
- git中hard参数的意义
撤销刚才的回退(窗口没关闭,能看到commit id 的情况)
$ git reset --hard (62851b)commit id
撤销刚才的回退(窗口已关闭,不能看到commit id 的情况)通过给git reflog 来查看以前的每一天命令,从中可以看到commit id
$ git reflog
工作区
版本库
- 暂存区
- master分支
撤销修改
-
一种readme.txt自修改后还没有加入到暂存区,现在撤销修改就是回到和版本库一摸一样的状态(git checkout --file)
$ git checkout -- readme.txt
-
一种是readme.txt已经添加到暂存区,但是没有提交,现在撤销就回到暂存区后的状态(git reset HEAD )
$ git reset HEAD readme.txt
-
注意事项:
-
– file空格和file之间有一个空额
-
git checkout – file 命令中的–很重要,如果–没有,就变成了“切换到另一个分支的命令”,我们在后面的分支管理中会再次遇到git checkout命令。
-
删除文件
前提:已经删除了工作区的文件。
第一种情况:误删文件,这个时候我们想要恢复通过git checkout – file命令来恢复。
第二种情况:不想要了这个文件,通过命令git rm 删掉,并且git commit
注意事项:从来没有被添加到版本库中就被删除的文件时无法恢复的。
删除工作区的文件(也可以手动删除)
$ rm test.txt
第一种情况
$ git checkout -- test.txt
第二种情况
$ git rm test.txt
$ git commit -m "remove test.txt"
添加远程库(origin repository)
-
将本地仓库与远程仓库关联
$ git remote add origin git@github.com:wanjie666666/learngit.git
-
取消本地仓库与远程仓库的关联
$ git remote remove origin
-
将本地库中的内容推送到远程库中(第一次提交要加上参数-u,以后提交不用直接git push origin master)
$ git push -u origin master
从远程仓库中克隆项目(通过git clone命令)
$ git clone git@github.com:wanjie666666/gitskills.git
- 总结
- 要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆
- Git支持多种协议,包括https,但ssh协议速度最快
- 注意事项
- 在克隆时一般关闭当前的窗口,重开一个命令执行窗口。
创建和合并分支
-
创建分支
$ git checkout -b dev
-
切换分支
-
第一种方式(git checkout )
$ git checkout dev
-
第二种方式(git switch )
$ git switch dev
-
-
创建+切换分支
-
第一种方式(git checkout -b )
$ git checkout -b dev
-
第二种方式(git switch -c )
$ git switch -c dev
-
-
查看分支
$ git branch
-
合并分支(合并指定分支)(git merge )
$ git merge dev
-
删除分支(git branch -d )
$ git branch -d dev
-
注意事项:
- 如何才有分支:在一开始创建项目时,应该要在提交之后才会有分支(master分支)
- 在没有合并之前,我们刚才在分支dev下对readme.txt的修改并提交,再切回到master分支时我们在readme.txt中时看不多内容变化的(在dev分支下可看到),因为那个提交实在dev分支上,而master分支此刻的提交点并没有变。合并之后可以看到。
解决冲突
-
冲突如何产生?
当我们对同一个文件的同一个代码修改时等情况。git在合并时不能判断接受谁的修改便产生了冲突。
-
产生示意图
-
解决方法
先解决掉冲突,然后在提交,合并完成。解决冲突就是把
git合并失败的文件手动编辑为我们希望的内容,在提交。
分支管理策略
通常,在合并分支时,如果可能,git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
使用普通方式合并
$ git merge --no-ff -m "merge with no-ff" dev
分支策略
- 在实际开发中,我们应该按照几个基本原则进行分支管理:
- 首先,
master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。 - 小结:Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过的合并。
Bug分支
我们工作到一半,还没完成此工作,没办法提交。但是此时我们有一个必须要解决的bug,怎么办?
将当前的工作现场“储藏”起来,等以后恢复现场后继续工作
$ git stash
然后确定bug在哪个分支上,然后在那个分支上建立临时分支修复bug
查看工作现场存到哪去了?用git stash list
命令查看
$ git stash list
恢复工作现场
-
一是用
git stash apply恢复,但是恢复后,stash内容并不删除,你需要用
git stash drop`来删除$ git stash apply stash@{0}
-
二是用
git stash pop
,恢复的同时把stash
内容也删了$ git stash pop
-
修复同样的bug,只需
4c805e2 fix bug 101
这个提交所作的修改复制到dev分支上。【注意】:我们只想复制这个提交所作的修改,并不是把整个master分支merge过来。 -
为了方便操作,git专门提供了一个
cherry-pick <commit>
命令,让我们能复制一个特定的提交到当前分支$ git cherry-pick 4c805e2
Feature分支
开发一个新feature,最好新建一个分支;
如果丢弃一个没有被合并过的分支,可以通过
git branch -D <name>
强行删除
强行删除没有合并过的分支
$ git branch -D feature1
多人协作
- 查看远程库信息,使用
git remote -v
- 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; - 在本地创建和远程分支对应分支,使用
git checkout -b branch -name origin/branch-name
,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
;【如果git pull
提示no tracking information
,说明本地分支和远程分支没有建立关联】 - 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。