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

 

 

posted @ 2020-05-17 16:44  luohaixian  阅读(320)  评论(1编辑  收藏  举报