赞
踩
“ 在上一篇文章中讲述了git的相关基础,这一篇就会带领大家具体的进行动手操作,让大家在工作中对git有一个更好的理解。”
提示:在使用git的时候,你需要对linux脚本命令有所了解,如果你很熟悉vim的话,那么恭喜你接下来的相关内容对你来说会非常简单,当然如果你不会的话,也没关系,照着下面的操作你也可以成功实现。01
—
git rebase的使用
如何修改commit提交
(1)首先我在github远程仓库中创建了一个git的项目,这个时候它里面只有一个READEME.md文件,然后我在本地会使用ssh方式来克隆线上的git项目;
(2)在你指定的文件夹中,右键选择Git Bash Here打开相应的界面,然后使用clone指令克隆文件:
git clone git@github.com:daipi173/git.git
,克隆完成之后你就会在本地看到一个git文件夹,它里面有一个READEME.md文件,此时就证明你已经克隆成功了;
(3)接着我们将git文件夹用vscode编辑器打开,然后开始进行相关的开发操作;
(4)现在我在项目中新增加了两个文件,分别是index.html和second.html文件,这个时候我向本地仓库提交了两个版本,使用git log --oneline查看commit提交的历史,如下图所示:
(5)这个时候我又在second.html文件中添加了一部分内容,然后又commit提交了一个版本,但是这个时候我不小心将commit中的注释内容写错了,如下图所示:
解决办法:由于该提交是最后一次提交的,因此我们可以git commit --amend来修改最后一次提交的信息,需要注意的是:git commit --amend只能修改最后一次提交的信息。当我在vscode终端中敲入指令:git commit --amend之后会显示如下所示内容: 只要你会linux脚本语言就应该很熟悉怎么修改,当我们将光标移动到你修改的地方,然后点击键盘中的i就可以开始进行修改,当你修改完之后先按下键盘上的esc,然后再同时按下shift+:之后(如果没有效果的话,可以尝试先按下键盘上的esc,然后再连续按两次大写字母z),然后再在冒号后面输入wq即可,这个时候你再在vscode终端中输入指令git log --oneline然后会看到修改之后的commit,如下图所示:(6)接着你是不是会想到git commit --amend只能修改最后一次提交的信息,那么如果想修改指定的历史提交应该如何做呢?很简单,这个时候我们应该使用git rebase -i来进行一个解决(在这里i表示interactive互动)。接下来我举一个例子:
假设我将第三次提交的commit进行修改,这个时候我将second.html改为second01.html,然后不想再提交一个注释,而是想将第三次提交的commit中的second.html修改为second01.html,然后具体的步骤如下所示:
a. git add .将修改全部内容放入暂存区中;
b. git commit -m "xxx...";
c. git log --oneline看看我们的commit提交历史,然后找到你要修改的内容,在这里我举的例子如下图所示:
d. 这个时候当我找到要修改第三个commit的内容,然后执行指令:git rebase -i HEAD~3(这里的意思是:从HEAD版本开始往过去数3个版本,3可以换位你要修改内容的位置数);e. 在进入到vim之后,我们找到要修改的commit提交内容之后,然后将它的pick修改为edit,然后保存退出(先按下键盘上的esc,然后再同时按下shift+:之后(如果没有效果的话,可以尝试先按下键盘上的esc,然后再连续按两次大写字母z),然后再在冒号后面输入wq即可),如下图所示:
f. 接着退出vim界面之后,可以按照退出之后git给你的提示进行下一步的操作,接着我们按照提示进行相应的指令:git commit –amend进入修改commit的vim页面,然后我们找到要修改内容之后点击键盘i进行相应的编辑,然后保存退出(保存退出布置和第5步一致);g. 此时你会看见vscode显示的是变基,其原因是因为我们使用rebase的原因,接着要解决的话也是按照git给你的提示来进行:git rebase –continue;h. 这个时候我们再使用指令:git log –oneline就会发现我们指定commit提交的内容已经修改了。注意:如果你想终止rebase的话,可以使用指令:git rebase –abort
(1)git rebase -i HEAD~3;
(2)然后找到要合并的内容,然后将pick修改为squash或者s,然后再保存退出;
(3)接着它会进入到合并的vim界面,然后我们进行一个相关的修改,写入你合并之后的commit内容,然后保存并退出,如下图所示:
(4)接着你查看commit提交历史,执行指令:git log –oneline之后就可以看到两个commit被合并为一个新的commit指令。
git rebase成功之后如何进行一个撤销
在使用git rebase过程中我们可以使用git rebase –abort/–continue来进行终止或者继续的操作,但是如果当我们成功之后那么应该如何进行撤销呢?答案很简单,我们可以使用reset指令来执行,具体内容如下所示:(1)首先查看本地记录:git reflog;(2)接着我们可以找到我们要撤销到哪一个步骤的id,id就是我们看到的那一串字母加数字组合的值;(3)接着我们找到id并复制,然后按键盘的esc之后,再按q进行一个退出,然后执行指令:git reset –hard id值。
注意:撤销回退时,使用git reset需要格外的小心
02
—
git revert和git reset撤销
在提交的时候,你肯定会有写错的时候,这个时候你就会想到如何进行撤回,接下来我就带领大家来学习一下如何进行撤回操作。我还是紧接着上面的例子继续往下进行演示,这个时候我在index.html文件中添加了一部分的内容,然后我commit提交了一个新的版本,但是这个时候我的操作有误需要进行一个撤销操作,那么下面就是有两个撤回的操作,接下来分别进行一个演示,看看他们之间的不同点是什么。
首先,当我进行一个新的commit提交之后,然后接着使用查看历史提交指令:git log –oneline进行一个查看,然后得到的内容如下所示:
git revert
git reset
Document 我是创建的第一个文件
在index.html文件中添加了更多的内容
(1)首先测试–hard的展示效果,由于git log –oneline我们查看历史提交记录中我们需要撤销的是最后一次的提交,因此在vscode终端中执行指令:git reset head~1 –hard,这个时候index.html中的内容变为如下所示:
Document 我是创建的第一个文件
并且当我们使用git log –oneline查看历史信息时,commit变为如下所示:
从这里我们可以看到commit的最后一次提交被撤回了,并且index.html中的内容也被修改了。
(2)接着我们测试–soft的展示效果,由于git log –oneline我们查看历史提交记录中我们需要撤销的是最后一次的提交,因此在vscode终端中执行指令:git reset head~1 –soft,这个时候index.html中的内容变为如下所示:
Document 我是创建的第一个文件
在index.html文件中添加了更多的内容
并且当我们使用git log –oneline查看历史信息时,commit变为如下所示:
从这里我们可以看到commit的最后一次提交被撤回了,但是index.html中的内容没有被修改。
git revert和git reset的区别
git撤销已经push到远端的commit
03
—
git stash暂存
git stash也是在开发过程中很常用的,一般用在比如你在开发代码时,临时负责人让你修改另一部分的内容或者重新写一个比较重要且急需的代码时,但是你又不想将现在这个开发一半的代码提交,这个时候就可以临时的开一个暂存来写这部分代码,具体演示过程如下所示: (1)假设在index.html文件进行一个新的开发,这个时候index.html中的代码才开发到一半,此时index.html中的代码如下所示: Document 我是创建的第一个文件
我是index.html文件开发到一半的内容,这个时候有新的需求。
(2)但是这个时候负责人很急需要你改一个bug,此使你不想将这个开发一半的代码提交,此使就可以使用暂存指令:git stash;
(3)当你把急需的bug修改完成提交之后,这个时候在让它从栈中弹出,即执行指令:git stash pop。
注意:git stash也需要和git add进行一个配合使用。
你还可以查看stash中相关的list列表:git stash list;删除所有存储进度:git stash clear(需要消息使用,如果删除的话当使用pop时就没有效果并提示你:No stash entries found)
04
—
git merge合并
git merge也是在工作中常常会用到的一个指令,它的主要作用是从指定的commit合并到当前分支的操作。05
—
git pull和git pull --rebase的区别
首先可以看一下它们两个的等价条件: (1)git pull = git fetch + git merge; (2)git pull –rebase = git fetch + git rebase。 第二点git pull会提交多余的commit,而git pull –rebase拉取下来后,可以省略掉无用的commit(参考来自于网络:–rebase的本意是想让事情的发展看起来很连续和优美,而不是多出很多无用的merge commit),接着就进行一个测试,具体演示过程如下所示: a. 首先在远程的仓库中修改一下index.html中的内容,然后再在vscode的终端中执行指令:git pull,这个时候你会看到终端中报错,报错内容如下所示: 当你执行:git pull –rebase时它也会给你报错,报错内容如下所示: 报错原因其实是:如果你没有将修改提交到暂存区,那么无论是pull还是pull –rebase都是不可以拉下来代码的; b. 接着如果我们git add .将它们放到暂存区,但是并没有commit将修改的内容放到新的版本中,然后我们再执行git pull或者git pull –rebase也是都会报错的,在这里就不进行贴图了,如果感兴趣的小伙伴可以自己手动尝试一下,接着我就说明一下报错的原因是:工作区不commit是无法pull代码的,同理可以推导出工作区不commit是无法push代码的; c. 从(2)中结论我们可以知道必须commit才可以push或者pull代码,接着我们先来测试git pull的过程,首先我们需要git add .以及git commit -m “…”,然后执行拉取远程代码:git pull,然后拉取下来合并冲突,接着执行git add .和git commit -m “…”; d. 如果测试git pull –rebase的话,首先执行git add .和git commit -m “…”,然后执行拉取远程代码:git pull –rebase,然后拉取下来合并冲突,接着git add .和git rebase –continue不断重复合并冲突,知道冲突被合并完(如何知道冲突被合并完,你可以vscode会提示你当前如果是基变的话,证明还没有将冲突合并完); e. 根据上面的,我们可以看出git pull需要多一次commit提交,而git pull –rebase不需要多一次的提交。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。