git如何更新fork的repository

来源:互联网 发布:php实现分页代码的思路 编辑:程序博客网 时间:2024/05/08 16:30

Fork一个别人的repository,做了一些改动,想提交pull request的时候,发现原先别人的repository已经又有了一些更新了,这个时候想使得自己fork出的repository也得到这些更新,即和原repository同步,该怎么做呢?这个问题应该被问烂了,stackoverflow上也有解答,基本上是指向的GitHub上的官方文档。最主要的是这2篇:

https://help.github.com/articles/configuring-a-remote-for-a-fork/

https://help.github.com/articles/syncing-a-fork/

本文略作翻译,以中文解答这个问题。

首先,检查一下当前的配置,看看当前有没有已经设置了上游,这要使用 Git remote -v 命令。如下:

[plain] view plain copy
  1. $git remote -v  
  2. origin  https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)  
  3. origin  https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)  
以上表明,origin这个repository对应的是远端的https开头的这个链接指向的repository,即自己fork出的repository.


第二步,将原repository设置为自己fork出的repository的上游(upstream)。运用如下的命令:

[plain] view plain copy
  1. $git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git  

运用第一步中提到的git remove -v命令再次检查一下,结果如下:

[plain] view plain copy
  1. $git remote -v  
  2. origin    https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)  
  3. origin    https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)  
  4. upstream  https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (fetch)  
  5. upstream  https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (push)  


第三步,运行 git fetch upstream 命令,如下:
[plain] view plain copy
  1. $git fetch upstream  
  2. remote: Counting objects: 75, done.  
  3. remote: Compressing objects: 100% (53/53), done.  
  4. remote: Total 62 (delta 27), reused 44 (delta 9)  
  5. Unpacking objects: 100% (62/62), done.  
  6. From https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY  
  7.  * [new branch]      master     -> upstream/master  
以上表明,远程的原repository上确实有一些更新,现在它们已经被download到本地的.git文件夹下了,但是还没有合并到本地的代码中。


第四步,git checkout master,这是保证切换到本地的repository的master上,如果本来就在,那么这一步不是必须的。

第五步,运行 git merge upstream/master 命令,将upstream/master上的更新合并到本地的master上,其实就是将第三步中download到.git文件夹下的那些change合并到本地的master中。如下:

[plain] view plain copy
  1. $git merge upstream/master  
  2. Updating a422352..5fdff0f  
  3. Fast-forward  
  4.  README                    |    9 -------  
  5.  README.md                 |    7 ++++++  
  6.  2 files changed, 7 insertions(+), 9 deletions(-)  
  7.  delete mode 100644 README  
  8.  create mode 100644 README.md  

如果本地没有什么自己独立的更新的话,那么将执行"Fast-forward"的合并。如果本地有自己独立的更新,而又会引起冲突的话,则要解决冲突,再commit.

关于解决冲突,如果明确所有冲突都是使用upstream/master上的来override自己的,那么可以直接运行如下命令,则无需解决冲突了:

[plain] view plain copy
  1. git merge -X theirs upstream/master  

注意,以上步骤结束后,仅仅是本地的fork出的repository和原repository取得了同步,如果想让远程的fork出的repository也同样取得同步,必须再git push上去。



阅读全文
0 0
原创粉丝点击