Git入门使用心得

一、简介

本文章为在VSCode中使用Git进行版本控制的使用心得,主要参考孟宁老师的文章:五⼤场景玩转 Git,只要这一篇就够了!

本文包含Git使用的四个场景:初始化本地仓库、克隆远程库、团队中的分支创建以及Rebase与Merge的区别。

由于VSCode中一些常用的基本操作可以通过菜单选项直接完成,所以本心得中大部分操作将通过菜单选项完成(每一部分对应的终端指令也会在该部分末尾列出),只有一些特殊情况将会使用命令行操作。


二、本地仓库的使用

1、初始化本地仓库

打开VSCode选择源代码管理,如果打开的文件夹中没有.git文件夹(即没有进行过初始化),则会出现初始化仓库的选项。

也可通过“ctrl+`”调出终端,输入以下命令,初始化本地库。

git init   

初始化本地仓库成功后,即可在工作区进行修改。创建一个测试文件test。此时文件的绿色U标识表明该文件未被追踪(若为橙色M表示该文件已被修改但未被提交)。

2、暂存更改

在源代码管理界面中,在【更改】区中点击文件后的暂存更改按钮即可将其移动到【暂存的更改】中。 

在【暂存的更改】中还可以将其移回【更改】区中。

通过终端操作的话参考以下命令:

#将特定文件(FILES)或者当前目录下所有文件添加到暂存区(Index);
git add FILES # 指定文件或文件列表 git add . # 用“.”表示当前目录
#取消将特定文件(FILES)或者所有文件添加到暂存区(Index),即从暂存区(Index)中删除 git reset HEAD FILES # 指定文件或文件列表 git reset HEAD
#放弃特定文件(FILES)或者所有文件的修改 git checkout -- FILES # 不要忘记“--” ,不写就把FILES当分支名了 git checkout .

3、将暂存文件提交至仓库

点击源代码管理界面的提交按钮或在菜单中选择“提交已暂存文件”即可将当前暂存区的修改全部提交至仓库。

点击提交后要求输入此次提交的消息,输入后回车即可完成本次提交。

对应的终端命令:

git commit -m "wrote a commit log infro" #把暂存区里的文件提交到仓库。
git log #查看提交日志,可以看到当前 HEAD 之前的所有提交记录。git reset —hard HEAD^
git reset —hard HEAD^^
git reset —hard HEAD~100
git reset —hard 128个字符的commit-id
git reset —hard 简写为commit-id的头几个字符  

三、远程库的使用

1、创建远程库

在浏览器中登录github,点击New按钮创建一个新的远程库“VSCodeGit_TestRepo”。

创建成功后单击Code按钮复制该远程库的URL。

在VSCode中选择新建窗口,新窗口中的VSCode处于未打开任何文件夹的情况下,切换到源代码管理界面,选择“克隆存储库”,在弹出的消息框中输入刚才复制的URL地址,单击从“存储库URL”,然后选择该克隆库的存储路径开始克隆。克隆完成后即可打开该库。

在该库中可以进行与前文提到的本地库中一样的操作,创建、修改文件并进行提交。不同的是,在提交后我们需要进行“同步”后才能在远程库中看到这次提交。在“视图”中打开“源代码管理存储库”。

点击框中的符号即可快速完成同步,也可通过菜单中的“同步”选项进行同步。

同步完成后在github中即可看到此次提交。

同步操作对应的终端命令:

git pull #拉取远程库的代码到本地
git push #将本地的代码推送至远程库  

四、团队项目中的分叉合作

1、创建分支

在菜单中选择“创建分支”然后输入分支名称“myBranch”。

创建成功后VSCode将自动切换到该分支下。当前所处的分支可以在源代码管理存储库中看到。单击分支名称还可以进行分支的切换以及创建新的分支。

单击图中的发布更改后,才可在github中看到该分支。

切换当前分支的终端命令:

git checkout -b myBranch

2、分支合并

在“myBranch”分支下创建文件“myBranchFile”并提交此次修改,完成同步后,我们在github的network视图中可以看到在该分支下完成了一次提交“B1”。

此时在主分支“main”上是看不到这次提交以及其所做的更改的,需要将“myBranch”分支合并到“main”上。

合并有两种方式,VSCode默认的方式是“快进式合并”(fast-farward merge)。合并前后大致如下左图,也就是“myBranch”分支与“main”分支会合并到一条时间线中。

第二种合并方式是保留“myBranch”分支时间线的合并,这种合并方式可以留下清晰的版本演进路径,如下右图。

             

第一种“快进式合并”的操作流程是:先在“myBranch”完成提交,然后切换到“main”分支下,进行“拉取”更新本地“main”的内容,然后选择合并“myBranch”。然后同步此次更改至远程库。 

 

合并后远程库的网络图如下,两分支合并到了“main”的时间线上,“myBranch”的时间线没有了,这就是“快进式合并”。

第一种合并对应的终端命令如下:

git merge myBranch

第二种合并方式需要使用控制台命令:

git merge --no-ff myBranch

 合并流程与上面相同,先切换到“main”分支上,使用“ctrl+`”快捷键调出终端,在终端中输入上面的命令即可。最后同步到远程库。

这种合并方式下github的网络图如下:

其他分支相关命令:

git branch -a #查看所有分支(包括本地和远程)
git branch -d 分支名 #删除本地的指定分支
git push origin --delete 分支名 #删除远程库中的指定分支 

五、Git Rebase

1、Rebase与Merge的区别

对比 merge 和 rebase 最终的历史记录,可以发现 merge 保持了修改内容的历史记录,但是历史记录会很复杂;而 rebase 后的历史记录简单,是在原有提交的基础上将差异内容反映进去。

如图,一开始主分支master为A,更新到B时创建了新分支bugfix并进行提交,更新到Y,主分支也在B的基础上进行提交,更新到D。

若执行merge,则将会将master和bugfix的修改内容汇合起来,最终生成一个提交E,master分支的HEAD移动到该次提交上。

若执行rebase,将会在master分支上新生成两个和X、Y内容相同的新提交X'、Y'。

2、在VSCode中进行Rebase

在“main”分支下先创建一个“rebaseBranch”分支用来测试rebase操作。创建一个文件并提交,提交信息设置为“X”,可以看到该次提交的hash码为3107e9

“main”分支进行一次提交“M3”。

 切换到“rebaseBranch”分支上,打开终端输入命令:

git rebase main

若没有冲突则显示rebase成功。rebase成功后需要将当前的“rebaseBranch”分支的更新推送并同步到远程库,此时github中可以看到已经成功rebase后的网络图,在main分支上创建了同样名为“X”的提交,但它的hash码为83e5743而不是3107e9b,表明这是两个内容形同的不同提交。

最后切换回“main”分支并将“rebaseBranch”分支合并后,最终的网络图如下:

3、更改发生冲突

在本地的“rebaseBranch”中对文件“mainFile3”做一次修改,并提交到本地,不同步到远程库,此次提交为A版本。

再对其进行第二次修改,同样只提交到本地,此为B版本。

再进行第三次修改同样提交到本地,此为版本C。此时不想让A、B版本的提交出现在远程库中的网络图中,即可rebase命令,使用vi编辑器将A、B版本删除。

使用vi文本编辑器的rebase命令:

git rebase -i  [startpoint]  [endpoint] 

其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支的HEAD。
一般只指定[startpoint] ,即指定从某一个commit节点开始,可以使用HEAD^^、HEAD~100、commit ID或者commit ID的头几个字符来指定一个commit节点,比如下面的代码指定重新整理HEAD之前的三个commit节点,即上面提交到本地的A、B、C三个节点。

git rebase -i HEAD^^^ 

输入上面的命令后终端会弹出如下界面,这就是文本编辑器。该文本编辑器的用法与Vim大致相同(应该就是内置了一个vi文本编辑器),按i键进入插入编辑模式,可以删除某个版本,也可以修改提交日志消息;按ESC键退出编辑模式回到一般命令模式(Normal Mode),这时按:键进入底线命令模式,输入:wq保存退出、输入:q退出、输入:q!强制退出。 

 由于我们不想在最后的远程库中显示A、B版本的提交,所以进入编辑模式,删除“pick 222014e A”和“pick 652f8ff B”,然后按ESC键退出编辑模式进入命令模式,输入“:wq”保存退出。此时会显示如下冲突信息。此时选择保留传入的更改,即版本C。

解决冲突后将修改移至暂存区,注意,此时不能通过VSCode的菜单操作移至暂存区,必须使用终端输入命令: 

git add .

然后执行如下命令继续rebase操作:

git rebase --continue

删除的A、B版本的内容很可能会合并到C版本,这时往往需要重新修改C版本的提交日志消息,因此在完成之前会进入文本编辑器修改C版本的提交日志,如下图。同样按i键进入插入编辑模式,可以修改C版本的提交日志消息;按ESC键退出编辑模式回到一般命令模式(Normal Mode),这时按:键进入底线命令模式,输入:wq保存退出。保存退出后即完成了git rebase操作。

这时查看提交日志可以发现A、B版本已经不存在了,只有修改过提交信息的C版本。 

最后,和场景三的第4步一样,先切换回“main”分支,将远程origin/main同步最新到本地存储库,再合并“rebaseBranch”到“main”分支,最后同步到远程库。

此时可以在github网络图中看到,开发过程中没有A、B提交,只有C提交。

4、Rebase与Merge的使用时机

变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。如果你已经将提交推送至某个仓库,而其他人也已经从该仓库拉取提交并进行了后续工作,此时,如果你用 git rebase命令重新整理了提交并再次推送,你的同伴将不得不再次将他们手头的工作与你的提交进行整合,如果接下来你还要拉取并整合他们修改过的提交,事情就会变得一团糟。
那么什么时候用merge,什么时候用rebase呢?总的原则是只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作。 

 


六、总结

通过学习实践,掌握了版本控制工具github在几大场景下的使用方法,以及在VSCode中进行源代码管理的各种操作。感谢孟宁老师的指导!

参考资料

https://www.cnblogs.com/zhangzhang-y/p/13682281.html
https://backlog.com/git-tutorial/cn/stepup/stepup1_4.html
https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg

 

posted @ 2020-10-11 12:09  末春雩风  阅读(185)  评论(0编辑  收藏  举报