Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将本地分支合并到修改后的原始分支_Java_Git_Github_Merge_Version Control - Fatal编程技术网

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

Java 将本地分支合并到修改后的原始分支,java,git,github,merge,version-control,Java,Git,Github,Merge,Version Control,我已将原始存储库分叉到我的github帐户中,并将其克隆到我的工作区中。在我的本地分支上工作了一周后,我想将我的本地分支推送到我的分叉存储库,然后将其与原始存储库合并。但我可以看到,我在本地分支中修改的文件也在原始存储库中修改过。我可以想出两种方法来安全地合并我的本地分支 我是否应该首先使用git pull将原始存储库中的最新更改获取到本地分支?在这种情况下,将覆盖整个文件,或者仅覆盖原始存储库中已更改的部分文件,以保留我的本地更改 第二种方法是将更改推送到分叉存储库,然后将其与原始存储库合并。

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

  • 我是否应该首先使用git pull将原始存储库中的最新更改获取到本地分支?在这种情况下,将覆盖整个文件,或者仅覆盖原始存储库中已更改的部分文件,以保留我的本地更改
  • 第二种方法是将更改推送到分叉存储库,然后将其与原始存储库合并。这里我假设
    Git
    仅当一个文件中有同一行的两个不同版本时才会考虑冲突。如果文件的两个版本在文件的不同部分发生更改,则可以安全地合并它们 我也不清楚
    Git
    何时合并一个文件的两个版本。它如何决定文件的哪个版本优先于其他版本


    任何其他方法都是受欢迎的。

    首先,在这种情况下很难避免冲突,通常与其他人在同一个存储库中工作时,您应该准备偶尔解决冲突

    在您的例子中,我将使用
    git-rebase
    并利用git分支,这是一个非常有用的特性

  • 使用本地更改创建单独的分支
  • 将本地主分支恢复到更改前的状态
  • 使用原始存储库中的更改更新本地主分支
  • 将主分支推送到远程存储库(以便分叉版本与原始存储库匹配)
  • 将您的本地要素分支重设为主要素。在这一步中,您可能需要解决一些冲突。但这会更容易,因为您基于当前主控(更改的目的地),并且您可以控制哪些应该进入,哪些不应该进入。此外,您可以在重新设置基础后轻松测试解决方案,并在发出拉取请求之前进行一些更改
  • 将带有更改的本地功能分支推送到远程存储库
  • 创建对原始存储库的请求

    // 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
    

  • 另外,
    git
    根据合并方向合并两个文件。如果您在分支a分支上,并且运行了
    git merge B-branch
    ,则B-branch中的文件具有“更高的优先级”,它们的更改很可能会自动应用

    我将建议您列出的第一种方法:从原始回购优先权中提取变化。原因如下:

  • 它将为查看pull请求和合并分支的用户节省能源
  • 如果在请求拉式回购时存在冲突,您还应该在本地回购中再次解决冲突,然后再次推送到fork回购
  • 从原始repo中提取更改仅覆盖部分文件,而不是所有文件。情况如下:

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

    git pull <remote> <branch> --rebase
    
    …---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查看者和审批者。

    无论您做什么,您都会看到潜在的冲突。您可以推送然后向父分支发出拉取请求,但如果存在合并c,GitHub将不允许它完成冲突。你也可以
    git pull
    ,但你也可能会遇到冲突。git是谨慎的,大多数时候都不会假设使用哪个版本,除非我们合理地清楚该怎么做。@TimBiegeleisen但这不是一个非常常见的场景,当我们处理子分支时,文件确实会在父分支中被修改。并且期望git不会o处理这件事。