git使用过程中遇到的问题以及解决方法

记录了git使用过程中遇到的问题以及解决方法

git stash暂存文件

当前分支还未完成所有的工作,然而又需要切换分支或者不能继续工作,可以采用git stash命令,切换回来以后再采用git stash pop命令切回

在idea 2020版中使用git stash命令有几率丢失文件

所以也可以commit 之后再切换分支然后再reset

git pull拉取分支

在团队开发时,可能出现增加了其他文件和修改统一文件的情况,此时需要git pull先合并再push,若不想合并则先fetch

git pull和git fetch的区别

目的不同

git fetch:从远程获取最新版本到本地,但不会自动 merge,用于从远程跟踪分支下载和查看其他人完成的最新提交,但不将这些提交合并到本地存储库中。它从远程存储库中获取更改并将其存储在本地存储库中。

git pull:从远程获取最新版本并 merge 到本地,它会自动将提交合并到您的本地存储库中,而无需查看提交。

用途不同

git fetch:Fetch 只是通过将提交从远程存储库传输到本地存储库来使远程存储库的本地副本保持最新。将提交导入到本地分支将允许您跟上其他人所做的更改。

git pull:Pull 将更改引入本地代码存储库,以使用远程存储库更新本地存储库。

用法不同

git fetch:当您想要查看其他人正在处理的内容时,Fetch 命令非常有用,这使您可以在将更改与本地存储库集成之前轻松查看其他开发人员推送的提交。您可以通过使用命令“git fetch ”来做到这一点,该命令从远程存储库中获取所有分支。

git pull:您可以使用命令“git pull ”来执行拉取,该命令检索分支的远程副本并将其与本地副本合并。这与使用命令“git fetch ”后跟“git merge ”完全相同。

远端跟踪分支不同

git fetch:Git fetch能够直接更改远端跟踪分支。

git pull:git pull无法直接对远程跟踪分支操作,我们必须先切回本地分支然后创建一个新的commit提交。

使用 git revert 回滚某次的提交

想象这么一个场景,你的项目最近有2个版本要上线,这两个版本还伴随着之前遗留的 bug 的修复,一开始的时候,你将 bug 修复在了第一个版本的 release 分支上,突然在发版前一天,测试那边反馈,需要把第一个版本修复 bug 的内容改在第二个版本上,这个时候,第一个版本的集成分支的提交应该包括了第一个版本的功能内容,遗留 bug 修复的提交和其他同事提交的内容,想要通过 reset 的方式粗暴摘除之前的关于 bug 修复的 commit 肯定是不行的,同时,这种做法比较危险,此时,我们既不想破坏之前的提交记录,又想撤回我们遗留 bug 的 commit 记录应该怎么做呢?git revert 就派上了用场。

git revert <commit-id> 针对普通 commit

git revert <commit-id> -m 针对 merge 的 commit

下面就用一个案例来理解一下这个命令,如下图所示,假设被红框框起来的地方是会引起 bug 的一次提交,在他的提交之后,又进行了2次提交,其中包含了其它同事的提交。

此时想把引起提交的 bug 的干掉,执行 git revert 1121932,执行操作后,再打开查看日志,如下图所示,可以看到是新增了一条 commit 记录,这个 commit 的产生的 msg 是自动生成的,Revert 开头,后面跟撤回的 commit-msg 信息 之前的 commit 记录并没有消失,此时也达到了代码回退的效果

此外 git revert 也可以回滚多次的提交

语法:git revert [commit-id1] [commit-id2] ... 注意这是一个前开后闭区间,即不包括 commit1 ,但包括 commit2 。

回滚我们的提交有二种方式,一种是上文提到的git revert命令外,还可以使用 git reset 命令,那么它们两者有什么区别呢?

git revert 会新建一条 commit 信息,来撤回之前的修改。

git reset 会直接将提交记录退回到指定的 commit 上。

对于个人的 feature 分支而言,可以使用 git reset 来回退历史记录,之后使用 git push --force 进行推送到远程,但是如果是在多人协作的集成分支上,不推荐直接使用 git reset 命令,而是使用更加安全的 git revert 命令进行撤回提交。这样,提交的历史记录不会被抹去,可以安全的进行撤回。