VS中git概念解析与深度使用
阅读原文时间:2023年07月08日阅读:1

四个区

  • 工作区(Working Area)
  • 暂存区(Stage)
  • 本地仓库(Local Repository)
  • 远程仓库(Remote Repository)

五种状态

  • 未修改(Origin)------工作区
  • 已修改(Modified)&未追踪(Untracked)------工作区
  • 已暂存(Staged)-------暂存区
  • 已提交(Committed)--------本地仓库
  • 已推送(Pushed)---------远程仓库

储藏和暂存

“储藏“可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

使用“储藏“的现实场景比如当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。

将你当前工作区代码储藏后,工作区这些代码会消失回到修改前的状态。

重新应用储藏的修改必须没有未提交的更改否则报错

储藏的修改如果被修改了那还原储藏的时候会出现 代码冲突,需要手动调节

“暂存”就是提交一次更改就是提交一次更改的前一个步骤,只有先放到暂存区才能后续提交到本地,同时有更改和暂存的时候进行提交会只提交已有的暂存。

它的意义在于实现了分批次提交,也就是我们因为某些原因更改了10个文件,但现在只想提交5个文件,这时候把这5个文件放入暂存区就是了,然后提交。

提取和拉取

fetch 只能更新远程仓库的代码为最新的,本地仓库的代码还未被更新,我们需要通过 git merge origin/master 来合并这两个版本,你可以把它理解为合并分支一样的。

pull 操作是将本地仓库和远程仓库(本地的)更新到远程的最新版本。

如果想要更加可控一点的话推荐使用fetch + merge。

还原-重置-挑拣

(以下为引用)

1:还原

还原针对的是某一次提交的所有commit,做了反向操作,新生成一个commit覆盖了这个操作。就和在同步界面Revert某个提交一样。

2:挑拣

还原本地2的提交后,对本地2的提交进行挑拣操作,发现代码又出现了。

结论:挑拣是针对两次commit之间不同代码的比对,后进行合并不同的代码。且针对的也是某一次提交。(和解决代码冲突的操作差不多)

应用场景: 当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用挑拣

3:重置--hard

(head指向本地仓库内容,index指向暂存区内容)

假设目前有三次提交A-B-C,对A进行“重置--hard”后发现本地1的代码回到了A。参考https://www.cnblogs.com/kidsitcn/p/4513297.html

结论重置--hard 将我们的head、index、工作区代码全部回滚到A。

但是需要注意的origin\中的内容并不会修改,本地如果现在直接“同步”操作后,做的重置--hard操作又没用了。

谨慎使用会造成代码丢失

4:重置--mixed

假设目前后三次提交A-B-C,对于A进行“重置--mixed”后发现本地代码没变,

但是head、index发生了更变,本地代码没变!自己可以修改本地代码后再次提交,但是对比的head、index不同了。这就会出现前面几次已经提交的更改会变成未提交的更改

以下是另外一个博主给出的解释:

所有该branch上从original HEAD(commit)到你重置到的那个commit之间的所有变更将作为local modifications保存在working area中,(被标示为local modification or untracked via git status),但是并未staged的状态,你可以重新检视然后再做修改和commit。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1,VS中如何处理代码冲突

(1)出现代码冲突的场景

1两人先后往同一个分支发出合并请求

2多个分支的代码合并到一个分支

3一人在同一个工作区签出分支,但前一个分支有更改未提交

(2)分别对应的解决办法

3产生冲突Vs会出现提示,点击冲突文件,选择保留合并即可

或者签出分支之前先将修改进行储藏,而不要暂存

2,VS中如何进行版本回退

(分别在更改和同步中)查看历史记录,点击右键选择还原,会还原到所点击节点的上一次提交

(分别在更改和同步中)查看历史记录,显示所有已提交更新,然后选中要恢复的版本,点击右键选择“挑拣”,VS会将当期版本作为待传出提交,提交至远程即可。

3,Vs中的分支管理(新建,合并,删除)

1,如何从任意一个提交上签出分支

查看历史记录-》签出分支

2,BUG分支与feature分支

就是用完就删除,分别用于debug和添加新功能测试

3,合并分支

这个地方常常出现提交冲突,原因一可能是远程库与本地库不一致导致的,先把远程库最新的提交拉取下来,不用怕拉下来会覆盖你修改的代码,如果你已经进行了本地的提交。原因二是下图这个情况,在本地仓库新分支签出和合并这两个时间段如果master是状态不变的则不会出现冲突,下图情况master变化了就是要手动合并了选择保留部分

4,版本管理方式

主要有俩,一通过新建分支,一个分支存一个版本,二通过打标签,通过标签号记录版本号

5,强制提交与覆盖

VS中好像没有强制提交和强制覆盖的方式,只能把远程拉取下来处理合并再重新推上去,用小乌龟和命令行可以强制推送,本地代码覆盖掉远程仓库

git push origin branch-name --force

远程仓库覆盖本地仓库

git fetch --all && git reset --hard origin/master && git pull

6,当本地仓库和远程仓库不同时,提交时提交发生冲突

发布到远程存储库时遇到错误: rejected Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing to the same ref. You may want to first integrate the remote changes before pushing again.

解决方案:

1,先拉取下来远程库,vs会提示你代码冲突,然后选择本地与远程代码进行保留,再进行一次本地提交,最后推送成功

2,注意如果要合并分支应该在拉取远程之后再合并

参考资料:

https://blog.csdn.net/qq_36383623/article/details/103090793

https://blog.gitee.com/2020/06/17/code-conflict/

https://blog.gitee.com/2019/04/25/gitee-branch/

https://www.cnblogs.com/zhaokunbokeyuan256/p/9597038.html

https://www.liaoxuefeng.com/wiki/896043488029600/900005860592480

https://blog.csdn.net/hhhhhhenrik/article/details/79482560