学习参考:https://www.liaoxuefeng.com/wiki/896043488029600
Git是分布式版本控制系统。
未跟踪-->工作区 --> 暂存区 --> 本地仓库 --> 远端服务器
1、本地操作
(1)基本操作
1、git init
本地目录中将文件夹初始化为git仓库
2、git add .
将工作区的所有文件添加到暂存区
git add file.cpp
将工作区的指定文件添加到暂存区
3、git commit -m "添加注释"
将暂存区中的文件Commit到本地仓库,实际上就是把暂存区的所有内容提交到当前分支。
假如file.txt先新增一行a,然后add,再新增一行b,然后commit,则commit只将a提交到本地仓库
git commit --amend "新的注释"
修改最后一次提交的注释信息
4、git remote add origin 直接复制url.git
将本地仓库链接到远终端,ssh方式直接复制url,不需要加.git
(2)查看相关
5、 git status
查看仓库状态
将工作区文件、暂存区文件同本地仓库进行对比
6、查看修改
1、 git diff file.txt
将工作区文件(add之前)同本地仓库(commit之后)进行对比,输出不同的地方。
2、git diff file.txt --cached
将暂存区文件(add之后commit之前)同本地仓库(commit之后)进行对比,输出不同的地方。
7、查看本地仓库不同版本的commit记录 git log
简洁版
git log --pretty=oneline
log中黄色的是commit id(版本号),HEAD表示当前版本,上一个版本就是HEAD^, 上上一个版本就是HEAD^^, 当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
查看分支合并图 git log --graph
(3)撤销相关
8、add之前
撤销工作区的修改 git checkout -- file.txt
修改了file.txt,但还没add,通过该命令行可撤销。add后不可撤销。
9、add后,commit前
撤销暂存区的修改 git reset HEAD file.txt
结果是把file.txt的操作撤回到工作区add之前,里面修改的内容仍然在,若想进一步撤回参考第8条
10、commit之后
版本回退(撤销本地仓库区的修改)
一般用于将目标commit之后的所有commit丢弃,如果回到过去后想回到未来,需要知道未来版本的版本号。
①git reset --hard 1094a
去到1094a开头的版本节点
②git revert 1094a
将1094a开头的版本节点复制出一个新的commit节点跟在当前HEAD的后面
③git reflog
命令查看每一次commit命令,找到目标commit的版本号。然后通过上述两个命令去到任何commit过的节点。
(4)删除文件
11、工作区删除 rm file.txt
12、确认要删除
git rm file.txt
git commit -m "remove file.txt"
13、11条后12条前,后悔删除,需要复原 git checkout -- file.txt
前提是file.txt之前commit过,复原成之前commit的样子
(5)stash
14、暂存工作区里的内容(add之前) git stash
多次stash是以压栈的形式保存,在stash list中,stash@{0}是最近一次压栈的。
不同的分支共用一个stash,可以在feat1中stash存储,然后去feat2中把feat1的stash调出来。
15、查看stash中保存的内容 git stash list
16、恢复stash中的内容
[1] git stash pop
弹出stash栈顶恢复工作区,并删除stash栈顶
[2] git stash apply
弹出stash栈顶恢复工作区,不删除stash栈顶
git stash drop
删除stash栈顶
[3] git stash apply stash@{1}
恢复指定的stash
2、本地和远端交互
1、将远端代码克隆到本地
(1) git clone https://github.com/GitHub用户名/要关联的仓库名.git
HTTP方式。添加后,对于本地来说,远程库的名字默认是origin
(2)
SSH方式。
2、解除远程链接 git remote rm origin
3、合并 git pull --rebase origin master
git pull
= git featch
+ git merge
git pull --rebase
= git featch
+ git merge --rebase
区别参考下面的合并分支小节。
4、push
推代码到远端仓库origin的master分支 git push -u origin master
第一次上传-u,之后不再需要,可直接git push origin master
或 git push
强制上传 git push origin master -f
git push origin dev1:dev2
:将本地的dev1分支的代码推代码到远端的origin仓库的dev2分支,如果远端不存在dev2则在远端新建一个,然后如有需要在远端申请将dev2合入master
5、查看远程库的信息
简 git remote
详 git remote -v
3、分支
1、创建分支
(1)git checkout -b dev
创建并切换到dev分支
创建分支的时候处于分支feat下,新分支就是feat的复制版。如在master下创建的分支feat1和在dev下创建的feat2里的内容是不同的。
切换分支 git checkout dev
(2)git branch feat01
基于当前分支创建分支feat01,但不切换到feat01
2、查看本地分支和当前分支 git branch
-a 查看所有分支(包括本地和远程)
-r 仅查看远程分支
3、合并分支
目的:将feat02分支的commit合并到feat01分支
(1)merge方式
git merge feat02
切回feat01分支,执行该命令,合并结束后的当前分支为feat01。
会产生新的commit节点来完成合并,新的commit节点会保存被合并的两个分支的所有commit记录。
(2)rebase方式:推荐使用
①git rebase feat01
切换到feat02分支,执行该命令,git将feat02分支的commit续在feat01后面。合并结束后的当前分支为feat02。
②git checkout feat01
切换回feat01
③git merge feat02
在feat01上执行该命令。得到线性的合并结果。
4、删除dev分支 git branch -d dev
删除一个有commit但没有被合并过的分支dev git branch -D dev
5、删除远端test分支 git push origin --delete test
4、问题和场景
1、github上传后文件夹是灰色的,无法打开
(1)删除内层文件夹里的.git
(2)如果还是不行,是因为有缓存,重命名,再add-commit-push
2、当前在dev分支工作中,master上出了bug
(1)储藏dev分支的工作 git stash
(2)切换到master分支,建立一个bug1分支,解决bug后合并master和bug1,删除bug1分支
(3)回到dev分支,git stash pop
,恢复现场并删除stash内容。git stash list
可以查看存储状态。
3、修改复制
在master分支上修改历史bug,commit后得到commit ID设为123456。然后由master拉出的其他分支都会有这个bug,避免重复劳动,需要把bug的提交123456复制到其他分支(如dev)上。
git cherry-pick
4、多人协作
[1] 首先,可以试图用git push origin
推送自己的修改。
如果推送失败,则是因为远程分支比本地的更加新,需要先用git pull试图合并;
[2] 如果合并有冲突,则解决冲突,并在本地提交;
冲突为:
<<<<<< HEAD
111111
===========
2222222
>>>>>> otherFeat
[3] 没有冲突则用git push origin
推送就能成功。
有冲突解决掉后,重新add-commit-push推送。这里的commit可以不用-m。
[4] 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to