Git使用总结
1 学习Git的方式
学习git最好的方式就是项目中使用git来管理版本代码,这样才会遇到各种问题,然后你才会想去想办法解决,印象才会深刻,否则学了后也只会记得简单的add、commit和push操作
这里推荐一个入门git教程网站,它可以相当于玩游戏一样来学习git,可视化的界面让你对git的命令执行有个画面,更好理解git的运行方式,这里附上该教程网站的地址:https://learngitbranching.js.org/
自己练习可以在github上创建一个仓库,然后建立分支来练习,可以利用github本身可视化建仓库流程建立一个仓库,然后本地端clone下来即可
如果是在windows下练习的话建议下载一个git bash软件,打开后像使用linux shell一样使用,很方便。还可以下载一个tortoisegit,一般用来查看当前文件修改地方,因为查看文件差异部分还是得可视化界面才直观点。
2 Git的基本命令
2.1 常用本地仓库操作命令
初始化当前目录为git仓库:
git init
可以将一个目录初始化为git仓库,比较少用,一般我们都是从已有仓库里clone下来,自己练习可以创建一个目录然后初始化为一个本地git仓库(建议还是直接clone一个远端仓库,这样既可以练习本地端的也可以练习远程端的操作)
查看当前分支的仓库状态:
git status
经常用来查看当前工作区改动的文件有哪些
添加修改文件:
git add 文件名
如果想添加当前目录下所有的修改文件,则执行:
git add . -A
commit修改的文件:
git commit -m “备注内容”
这是把git add的内容提交到本地,作为一次提交记录
修正上次的commit:
git commit --amend
该命令很强大,它可以把这次add的修改融合到上一次的commit里,且支持修改上一次commit的备注,当执行完后上次commit的uuid也会变化
举个例子:
我一开始修改了一个a文件,然后add,然后commit
这时我发现我还需修改一个b文件,但不想再commit一条记录,这时我们可以修改b文件,然后add,然后执行git commit --amend,此时会弹出窗口可以让你修改上一次commit的备注(也可以不修改)且告诉你改了哪些,然后wq退出就可以看到还是一条commit记录
查看提交记录:
git log
可以看到已经提交的记录,每个记录都会有个uuid,方便对提交进行其它操作使用的,后面会使用到
使用tortoisegit看提交记录会更友好点
回退版本:
使用git reset,它能回退到某个版本,但文件内容还是更改过的,只不过是未add状态
回退到上个版本:git reset HEAD^
如果是好几个版本前则:git reset HEAD~num
num是数字,表示回滚到多少个版本前
有很多版本其实用git reset 版本uuid 更好,免得数错了
撤销版本改动:
git revert跟git reset功能有点像,但表现出来的效果是不一样的,git revert它是把内容改动变回到某个版本并进行提交操作了,它相当于你手动改回某个版本一模一样的内容然后commit一个提交,如下图:
提交了个revert “1”的提交
而reset则是真的退回到某个版本,前面的版本好像没有一样
比如我再执行git reset HEAD~2
这是回退2个版本到1版本,可以看到现在的git log
已经是看不到刚才的2提交和revert 1提交了,我们再看git status
可以看到内容回退了,但改动还是未add状态
一般我们比较常用到的是git reset
恢复文件到某个版本的内容:
git checkout uuid 文件名
如果想把它恢复到当前提交版本的内容则接着使用git checkout -- 文件名
文件名如果是目录则回滚整个目录
如果是放弃当前某个文件的改动则:
git restore 文件名
移动HEAD指向:
git checkout commit_uuid
相当于将HEAD指针移动到某个commit点上
可以使用git checkout 分支名又回到该分支指向的提交上
如果要强制移动某个分支指向的commit点,则:
git branch -f 分支名 commit_uuid
查看当前工作区有哪些分支:
git branch
创建分支:
git branch 分支名
在当前分支的基础上创建分支
切换到某个分支:
git checkout 分支名
使用git checkout -b 分支名 可以创建并切换到该分支(经常使用)
分支改名:
git branch -m oldbranch newbranch
rebase合并提交:
git rebase -i HEAD~2
这是代表我将前两个提交合并为一个
举个例子:
我原先的git log是这样的:
我想将1和2这两个提交合并为一个,只保留1的提交备注,但内容是1和2两个commit的改动合并则执行git rebase -i HEAD~2(如果是合并前3个则是HEAD~3)
将第2个pick改为s并wq保存退出,s的含义我们可以看到是提交到上一个commit里,意思就是commit内容合并到上一个commit里即1那里
然后会让你选择备注,你可以删除掉2的备注然后wq保存退出
修改后:
使用git log可以看到只有1的提交记录了,但内容是1和2的提交合并的
cherry-pick选择合并:
cherry-pick常常是用在将某个其它分支的提交点合并到当前分支上,举例子,比如当前分支是test分支,想要将test2分支上的commit_uuid1提交点的改动合并过来,则:
git cherry-pick commit_uuid1(如果想合并多个提交点,则空号相隔,比如git cherry-pick c1 c2)
分支合并:
git merge 分支1 分支2
合并分支1和分支2
2.2 常用远程仓库操作命令
克隆远程仓库:
git clone xxx.git
如果是想要克隆指定分支则:
git clone -b 分支名 xxx.git
查看本地分支与远程分支的对应关系:
git branch -vv
添加本地仓库与远程仓库关联:
git remote add origin xxx.git
用的比较少,一般clone下来后自动就关联了,除非是自己git init了个项目,然后想推送到远端上建立一个仓库
删除当前远程连接的仓库关联:
git remote remove origin
推送分支到远端:
完整原型:git push origin <source>:<destination>
git push origin 分支名 等价于 git push origin 分支名:分支名
获取远端分支数据:
完整原型:git pull origin <source>:<destination>
注意这个source是远程分支名,destination才是本地,跟push的相反
一般本地分支同步远端的分支数据直接执行git pull即可
当然也支持当前分支拉取其它分支数据,比如git pull origin master:test,不过一般不常使用,最常用还是更新对应端的远端分支数据,所以最常使用git pull命令
拉取某个分支到本地:
git fetch origin :test
拉取远端test分支到本地并切换到test分支
删除远端分支:
git push origin :bar
删除远端bar分支,这命令可以理解为将本地空分支推给远端,故远端分支被删除掉
3 Git的冲突处理
当自己的远端test分支要合并到远端master分支冲突时的处理步骤(以分支test存在冲突为例):
(1)切到主分支:git checkout master
(2)更新本地主分支最新代码:git pull
(3)把本地的要上库的分支删除: git branch -D test
(4)在当前主分支下创建一个test名的分支:git checkout -b test
(5)找到要提交的代码(id可以直接在github上copy提交的id):git cherry-pick 332c5e25a5a93c9f6e95e7fae8b46919260416aa,此时可能会提示你冲突,cherry-pick变为cherry-picking
(6)git status查看冲突的文件,打开它手动编辑冲突的地方,解决完后add命令添加
(7)解决完冲突并修改提交信息:git cherry-pick --continue。(如果想终止cherry-pick则可以git cherry-pick --abort)
(8)强推分支:git push origin test -f
4 Git的小技巧
(1)回到上一个分支名:
git checkout -
类似于cd -的操作,回到上一次的目录
(2)修改基础分支
比如我先从主分支master新开了分支test1,加上代码后,提交上去,但是还没有合并到主分支,这时我需要在test1分支基础上继续开发新功能,以test1为基础又开一个分支test2,当test1被主分支合并后,如果test2想提交到主分支,可以修改test2的基础分支,一开始test2的基础分支是test1的,可以通过使用git rebase将基础分支改为master
切换到test2分支:git checkout master
修改test2的基础分支:git rebase master