将本地分支合并到修改后的原始分支

时间:2017-12-12 07:59:25

标签: java git github merge version-control

我已将原始存储库分叉到我的github帐户并将其克隆到我的工作区中。在我的本地分支上工作一周后,我想将我的本地分支推送到我的分叉存储库,然后将其与原始存储库合并。但我可以看到我在本地分支中修改过的文件也在原始存储库中被修改过。我可以想到两种方法可以安全地合并我的本地分支。

  1. 我是否应该首先使用browser.executeScript('window.scrollTo(0,200);').then(function () { 从原始存储库获取最新更改到我的本地分支?在这种情况下,将覆盖整个文件,或者仅保留原始存储库中已更改的文件的一部分,以保留我的本地更改。
  2. 第二种方法是继续将我的更改推送到我的分叉存储库,然后将其与原始存储库合并。在这里,我假设git pull仅在文件中存在同一行的两个不同版本时才考虑冲突。如果文件的两个版本在文件的不同部分中有变化,则可以安全地合并它们。
  3. 我还不清楚Git何时合并两个版本的文件。它如何决定哪个版本的文件优先于另一个版本。

    欢迎采取任何其他方法。

2 个答案:

答案 0 :(得分:1)

首先,在这种情况下,很难避免冲突,并且通常与其他人一起处理同一个存储库,您应该准备好偶尔解决冲突。

在你的情况下,我会使用git rebase并使用git branches,这在使用得很好时是一个非常有用的功能。

  1. 在本地创建单独的分支
  2. 将本地分支恢复为此更改前的状态
  3. 使用原始存储库中的更改
  4. 更新本地分支
  5. 将您的分支推送到您的远程存储库(以便您的分叉版本与原始存储库匹配)
  6. 重新启动您的本地功能分支到主服务器。在此步骤中,您可能需要解决一些冲突。但它会更容易,因为你是基于当前的主人(你的变化的目的地),你掌控应该进入什么,什么不应该进入。此外,您可以在rebase之后轻松测试您的解决方案,并在发出拉取请求之前进行一些更改。
  7. 将您对更改的本地功能分支推送到远程存储库。
  8. 创建对原始存储库的拉取请求。

    // I assume that your local master branch is set up to track origin/master branch, where origin is your forked version of the original repository. 
    // 1. Local branch named "my-new-feature"
    $ git branch my-new-feature
    // 2. Reset your master branch back to the state before changes
    $ git fetch origin
    $ git reset --hard origin/master
    // 3. Update local master branch. First you need to add the original repository as a remote (let's name it "upstream") 
    $ git remote add upstream https://github.com/some-user/some-project.git
    $ git fetch upstream
    // you should still be on your local master branch. Now update this local branch with changes from the original repo
    $ git rebase upstream/master
    // 4. Push your local master to your forked repository
    $ git push origin master
    // 5. Rebase your changes onto master
    $ git checkout my-new-feature
    $ git rebase master
    // This is the place where you are most likely to have conficts. Read git messages, as it helps you what to do. 
    // Once all conflicts have been resolved, stage your changes but do not commit. If committed they will not be detected by ongoing rebase.  
    $ git add .
    $ git rebase --continue
    // 6. Push your local branch with newest changes
    $ git push origin my-new-feature
    // 7. Issue a pull request on GitHub using your just pushed branch
    
  9. 此外,git根据合并的方向合并两个文件。如果您在分支A分支上,并且运行git merge B-branch,则 B-branch 中的文件具有“更高优先级”,并且他们的更改很可能会自动应用。

答案 1 :(得分:0)

我会建议您列出的第一个approch:从原始repo冷杉中拉出更改 t。原因如下:

  1. 为查看拉取请求并合并分支机构的用户节省能源。
  2. 如果提出拉取请求存在冲突,您还应该在本地仓库中再次解决冲突,然后再次推送到fork仓库。
  3. 从原始仓库中提取更改仅覆盖部分文件而非覆盖所有文件。情况如下:

    • 原始仓库和本地仓库中的文件均未更改:这些文件不会更改。
    • 原始仓库中的文件已更改但未在本地仓库中更改:这些文件将作为本地仓库中原始仓库的版本进行修改。
    • 原始仓库中的文件未更改,但在本地仓库中已更改:这些文件不会被覆盖。
    • 文件在原始仓库和本地仓库中均已更改:这些文件将显示为冲突,您应手动解决冲突。
  4. 要从原始仓库中提取更改,最好使用--rebase选项(首先从原始仓库中提取更改,然后在最新的原始仓库顶部应用您的本地更改:

    git pull <remote> <branch> --rebase
    

    假设在git fetch之后提交histroy如下(origin是fork repo的远程,upstream是原始repo的远程):

    …---A---B---C---D---E  master, origin/master
             \
               F---G---H  upstream/master
    

    然后你可以执行以下命令:

    git pull upstream master --rebase 
    git push origin master -f
    

    然后提交历史记录将是:

    …---A---B---F---G---H---C'---D'---F'  master, origin/master
                        |
                  upstream/master
    

    然后,您可以创建PR以将fork repo master分支合并到原始仓库中。对于PR查看者和审批者来说会很方便。