Java 将本地分支合并到修改后的原始分支
我已将原始存储库分叉到我的github帐户中,并将其克隆到我的工作区中。在我的本地分支上工作了一周后,我想将我的本地分支推送到我的分叉存储库,然后将其与原始存储库合并。但我可以看到,我在本地分支中修改的文件也在原始存储库中修改过。我可以想出两种方法来安全地合并我的本地分支Java 将本地分支合并到修改后的原始分支,java,git,github,merge,version-control,Java,Git,Github,Merge,Version Control,我已将原始存储库分叉到我的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中的文件具有“更高的优先级”,它们的更改很可能会自动应用 我将建议您列出的第一种方法:从原始回购优先权中提取变化。原因如下:
- 原始回购和本地回购中的文件均未更改:这些文件不会更改
- 在原始回购中更改但在本地回购中未更改的文件:这些文件将被覆盖为本地回购中原始回购的版本
- 在原始回购中未更改但在本地回购中更改的文件:这些文件不会被覆盖
- 在原始回购和本地回购中更改的文件:这些文件将显示为冲突,您应该手动解决冲突
--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处理这件事。