git 强制云端覆盖本地

1004 2023-04-26 11:13

git使用的过程中,有时候本地进行了一些无关紧要的更改,再想拉取在另一设备上提交的记录的时候,会报冲突,拉取失败。这种时候,就可以使用强制更新云端到本地,需要注意的是,这会丢失所有本地更改,除非真的确定本地更改无关紧要才可。

 //将云端更新拉取到本地
git fetch --all 
 // 撤销本地、暂存区、版本库 (用远程服务器的 origin/master 替换本地、暂存区、版本库)
git reset --hard origin/master 
// 从远程仓库 "同步" 代码
git pull origin master

// 合并执行
git fetch --all && git reset --hard origin/master && git pull

 

 git使用系列 4.1 git 实践(一) pull的使用

git pull来从远程仓库"同步"代码,通常有三种方式;

git pull origin <remote_branch>:<local_branch>
git pull origin <remote_branch>
git pull

1.git pull origin <remote_branch>:<local_branch>

这种用法写起来最为繁琐,但最好理解:

场景:当本地的当前分支不是local_branch;
作用:将远程分支拉取到指定本地分支;

例如:当前分支是dev,但是你想把远程master”同步”到本地master,但又不想使checkout切换到master分支;
这时你就可以使用  git pull origin master:master

2.git pull origin <remote_branch>

场景:在当前分支上进行同步操作;
作用:将指定远程分支同步到当前本地分支;

3.git pull

场景:本地分支已经和想要拉取的分支建立了“关联”关系;
作用:拉取所有远程分支的新版本"坐标",并同步当前分支的本地代码(具体根据关联分支而定)

 

 上面是简单的理论:实际情况中 git 多人同时修改一个文件后的合并

一、git fetch 和 git pull 的区别

1、    git fetch <远程主机名> <远程分支名>:<本地分支名>

         git fetch origin master :temp             //将远程仓库origin的master分支的

        git diff temp                    //比较本地代码和远程代码的区别    

        git merge temp               // 合并temp分支到本地的master分支

2、git pull <远程主机名> <远程分支名>:<本地分支名>

                             //取回远程分支的更新,并直接与本地分支合并

区别:git  pull 可以看作是git fetch 和 git merge 两个步骤的集合。

 

二、多人协作,当他人修改文件后,后提交的必须先pull在合并,并且在合并的时候会出现冲突

    1、当远程仓库的代码更新后,我们在push提交时会出现提交不了的情况,这时我们必须pull更新后的远程代码。但是在远程代码合并本地代码时发生CONFLICT冲突,这时需要我们手动解决冲突,最后再push提交到远程代码。

    2、解决方法  :

          先 git add 和 commit 添加一下本地分支的代码

             git checkout  branch          //选择分支

            git fetch origin master       //拉取远程更新代码(只拉取不合并),这里不能git pull (合并有冲突)

            git rebase  origin/master   //查看conflict ,手动修改冲突

            git add  .

            git rebase --continue       //add 后不需要git commit

            git push origin

rebase

本地两个分支 一个我的分支 test 一个主分支 master

现在我修改的部分要合并到 master 上,可以有两种选择 merge 或者 rebase

两者的最后得到的结果是一样的,但是区别是 rebase 一个 两个分支 就变为了一个分支,test合并前所有的 patch也就是commit 消失了

而merge 则还是两个分支,只不过在merge后这个点交汇

图示

merge

rebase

为了让分支树看起来更简化,所以我们选用rebase

如何rebase 呢?

首先我的本地代码库都不是最新的,所以先从远端仓库pull一下

git checkout master`
git pull

然后 开始和test分支rebase

git checkout test
git rebase master

这个时候就开始rebase 了,一般情况下rebase都是会有冲突的,详细查看冲突可以用命令git status然后就会显示哪个文件有冲突,然后打开有冲突的哪个文件,会发现有一些“<<<<<<<”, “=======”, “>>>>>>>” 这样的符号。

“<<<<<<<” 表示冲突代码开始

“=======” 表示test与master冲突代码分隔符

“>>>>>>>" 表示冲突代码的结束

<<<<<<<  
所以这一块区域test的代码

=======  
这一块区域master的代码

rebase 和 merge的另一个区别是rebase 的冲突是一个一个解决,如果有十个冲突,先解决第一个,然后用命令

git add -u 
git rebase --continue 

继续后才会出现第二个冲突,直到所有冲突解决完,而merge 是所有的冲突都会显示出来。
另外如果rebase过程中,你想中途退出,恢复rebase前的代码则可以用命令
git rebase --abort

所以rebase的工作流就是

git rebase 
while(存在冲突) {
    git status
    找到当前冲突文件,编辑解决冲突
    git add -u
    git rebase --continue
    if( git rebase --abort )
        break; 
}

最后冲突全部解决,rebase成功!!

然后我需要把本地的test 分支push 到远端test分支上然后再给远端的master分支 PR。

但是git push 以后总是提示不让我push 百度了一下发现原因:

比如远端仓库的代码 A 和 B 都 clone 了一份,然后B修改了x.txt文件后push到了仓库, 这个时候 A 就不能直接push了,因为A的x.txt文件没有修改,所以此时A应该把远端的仓库pull一下,merge掉x.txt文件的冲突,才能push所以我这里就犯了一个错误,应该在rebase 前,先把原来本地的test分支push到远端,否则rebase之后就相当于两个人一个人改了文件。另一个人就无法push了。

所以这里需要pull一下
git pull
因为是merge所以这里会出现所有的conflict
git status
查看 编辑冲突后再 git pull一下,就合并了。
最后把本地分支test push到远端分支
git pull
git push origin test
最后PR(pull request)即可。
总结
rebase 工作流:

git rebase
while(存在冲突){
 	git status
	解决冲突
 	git add -u
 	git rebase --continue
 	if(git rebase --abort)
 		break;
 }

merge工作流 :

git pull
编辑冲突文件
git add .
git commit -m "feat: this is a comment"
git push

 

全部评论

·