如何使用远程主服务器重新定义本地分支

Dam*_*mir 833 git git-rebase

我从远程存储库的master分支克隆了项目remote_repo.我创建了新的分支,我承诺了那个分支.其他程序员推到remote_repo了分支机构.我现在需要将我的分支RB重新绑定到remote_repomaster上.这该怎么做 ?键入终端的命令是什么?

Fre*_*abe 1143

首先从上游存储库中获取新主服务器,然后根据该工作分支重新设置工作分支:

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master
Run Code Online (Sandbox Code Playgroud)

更新:请参阅Paul Draper的答案,以更简洁的方式来做同样的事情 - 最近的Git版本提供了一种更简单的方法来完成上述两个命令的等效操作.

  • 这是实际做出要求的唯一答案 (14认同)
  • @erik请注意Paul Draper在kayaker243评论后半年左右写了他的答案(差不多两年后这个答案). (7认同)
  • @ kayaker243不,这与Paul Drapers的答案相同,但我想是长篇. (4认同)
  • 我得到以下内容:`你的分支和'origin/b1'分歧,#并分别有3个和2个不同的提交.看起来像是另一个`git pull`.这是正确的还是我错过了什么? (3认同)
  • @RGC不,`git rebase master`将不会执行与第二个命令(`git rebase origin/master`)相同的工作,因为`master`和`origin/master`可能指向不同的提交(特别是考虑到第一个)命令是`git fetch origin`,它可以修改`origin/master`). (2认同)

Pau*_*per 760

git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]
Run Code Online (Sandbox Code Playgroud)

  • (相当于Frerich的答案) (18认同)
  • 这与弗里奇的回答没有什么不同,因为这将改变原始大师到当地大师的变化,而弗里奇的答案让当地大师不受影响?(拉动与获取) (12认同)
  • @adhominem - 我检查了[git-pull documentation](https://git-scm.com/docs/git-pull),我看不到任何支持修改本地主服务器的声明.如果我在一个名为`dev`的分支上并运行`git pull --rebase origin master`,那么只有分支`dev`将被修改,而不是`master`.`--rebase`标志文档声明它在获取后尝试"在上游分支之上"重新绑定当前分支,而不是修改本地跟踪分支. (11认同)
  • 仅供参考,您可以使用`git pull --rebase = interactive origin master`进行交互式rebase (9认同)
  • 不,在Frerich的回答中,rebase修改了本地主人.pull --rebase与fetch后跟rebase是一回事 (7认同)
  • @studro 我假设您在本地主机上调用 pull --rebase 。否则,我就错了。 (2认同)
  • 啊,对 - 这是有道理的.谢谢.我只是有点困惑,因为我认为原来的问题意味着他们在当地的分支机构(`RB`我认为他们叫的吗?)不是`master`的其他. (2认同)
  • 我更喜欢这个,因为`git fetch origin` 带来了所有远程分支,甚至是不完整的分支,而我只需要一个特定的分支。最好是单线 (2认同)

Cha*_*esB 186

在提交给您的分支的更改后,checkout master并从中获取以从repo获取更改:

git checkout master
git pull origin master
Run Code Online (Sandbox Code Playgroud)

然后检查你的分支并在master上重新修改你的更改:

git checkout RB
git rebase master
Run Code Online (Sandbox Code Playgroud)

或者在一行中的最后两个命令:

git rebase master RB
Run Code Online (Sandbox Code Playgroud)

  • `git push --force-with-lease` 是在 rebase 后推送更改的更安全的方法。它基本上会检查团队中的其他成员在推送更改之前是否已做出提交。请参阅 /sf/ask/3697658471/ (5认同)
  • 当试图推回原点/ RB时,你可能会收到一个错误.如果你是唯一一个在RB上工作的人,你可以使用gforce push --force origin RB.来源:http://stackoverflow.com/questions/8939977/git-push-rejected-after-feature-branch-rebase (4认同)
  • 啊……我正好有这个。我的“RB”已正确重新基化,但在重新基化后尝试推送它时,我遇到了无尽的错误。除了推 --force origin RB - 是否还有“更好”(非强制)的方法来做到这一点?我只是试图理解这里的感知 - 但失败了。 (2认同)
  • @MottiShneor不,没有好办法.如果其他人在同一时间推进分行,他们的变化将会丢失!如果你想对git提交历史很好,你应该将master合并到你的分支中,这是安全的(你可以做`git push`而不用`-f`). (2认同)
  • 感谢您的回答。这对我有很大帮助。很多。 (2认同)

bh4*_*4th 105

注意:如果您对rebase有广泛的了解,那么请使用一个衬垫以下快速变形. 解决方案: 假设您在工作分支机构,并且您是唯一一个从事该工作的人.

git fetch && git rebase origin/master
Run Code Online (Sandbox Code Playgroud)

解决所有冲突,测试代码,提交并将新更改推送到远程分支.

                            ~:   For noobs   :~
Run Code Online (Sandbox Code Playgroud)

以下步骤可能会帮助任何新手git rebase并且想要轻松完成任务的人

第1步:假设此时没有对YourBranch进行提交和更改.我们正在访问YourBranch.

git checkout YourBranch
git pull --rebase
Run Code Online (Sandbox Code Playgroud)

发生了什么?拉出在您的分支上工作的其他开发人员所做的所有更改,并在其上重新定义您的更改.

第2步:解决出现的任何冲突.

第3步:

git checkout master
git pull --rebase
Run Code Online (Sandbox Code Playgroud)

发生了什么?从最新master上的master和rebases master中提取所有最新更改.

第4步:解决出现的任何冲突.

第5步:

git checkout YourBranch
git rebase master
Run Code Online (Sandbox Code Playgroud)

发生了什么?关于master的Rebase发生了

步骤6:如果存在冲突,请解决所有冲突.用于git rebase --continue在添加已解决的冲突后继续rebase.您可以随时git rebase --abort用来中止rebase.

第7步:

git push --force-with-lease 
Run Code Online (Sandbox Code Playgroud)

发生了什么?将更改推送到远程YourBranch.--force-with-lease将确定在您重新定位时是否有来自其他开发人员的YourBranch的任何其他传入更改.这非常有用,而不是强制推动.如果有任何传入的更改,则在推送更改之前获取它们以更新本地YourBranch.

为什么我需要推动更改?在正确的rebase之后重写远程YourBranch中的提交消息或者是否解决了任何冲突?然后,您需要将在本地存储库中解决的更改推送到YourBranch的远程仓库

Yahoooo ...!您已成功完成变基.

你可能也在考虑做:

git checkout master
git merge YourBranch
Run Code Online (Sandbox Code Playgroud)

何时以及为何?如果您和其他联合开发人员进行了更改,请将您的分支合并为master.当你想在以后的同一个分支上工作时,这使得YourBranch与master保持同步.

                            ~:   (?? ? ?)? rebase   :~
Run Code Online (Sandbox Code Playgroud)

  • “git Push --force-with-lease”是一个棘手的问题,在 rebase 时没有人谈论它,因为你会得到一个“你的分支在 X 前面,Y 在原点后面”,如果你尝试再次拉动和推送,就会出现“你的分支在 X 前面,Y 在原点后面”。把事情搞得一团糟。 (3认同)

小智 38

第1步:

git fetch origin
Run Code Online (Sandbox Code Playgroud)

第2步:

git rebase origin/master
Run Code Online (Sandbox Code Playgroud)

第 3 步:(如果有冲突,请修复)

git add .
Run Code Online (Sandbox Code Playgroud)

第四步:

git rebase --continue
Run Code Online (Sandbox Code Playgroud)

第 5 步:

git push --force
Run Code Online (Sandbox Code Playgroud)

  • 没有解释从哪个分支开始。这不是一个好的答案。 (37认同)
  • 如果您不确切知道其含义,请不要这样做。强行推动不是一个好主意。 (10认同)
  • !!! 请不要执行 `git push --force` 可能非常非常危险。https://www.datree.io/resources/git-push-force (3认同)
  • 顺便说一下,“git push --force”是“必须”的,否则如果你使用简单的“git push”,你将会有重复的提交 (2认同)

Naz*_*Naz 6

git fetch origin master:master 拉取最新版本的master,而无需检出。

因此,您需要做的是:

git fetch origin master:master && git rebase master


Erk*_*nen 6

如果当前分支有很多提交,并且需要在变基之前对它们进行压缩、修复和重写,那么交互式变基是正确的答案。当软件工程师说“在 master 之上进行 rebase”时,他们通常的意思是“在 origin/master 之上进行交互式 rebase,并确保它看起来很棒,不必要的提交被压缩,并且提交消息得到纠正”。

首先,检查 git status并确保在功能分支中启动。

如果不在功能分支中,请尝试git checkout feature 然后

git fetch origin
git rebase -i origin/master
Run Code Online (Sandbox Code Playgroud)

极少数情况下,当请求在 master 之上进行变基时,提交历史记录就可以被变基了。在大多数情况下,首先使用交互式变基修改现有提交。


N D*_*oye 5

1.先更新Master ...

git checkout [master branch]
git pull [master branch]
Run Code Online (Sandbox Code Playgroud)

2.现在使用master分支对源分支进行重新设置

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]
Run Code Online (Sandbox Code Playgroud)

如果远程上尚不存在源分支,请执行以下操作:

git push -u origin [source branch]
Run Code Online (Sandbox Code Playgroud)

“等等!”

  • 我喜欢这个答案的循序渐进的性质。它有助于分解到底发生了什么。 (2认同)