【问题标题】:understanding git fetch then merge理解 git fetch 然后合并
【发布时间】:2010-08-05 22:18:05
【问题描述】:

来自svn背景,我有这个问题:

git equivalent of svn status -u

svn status -u 的 git 等价物是什么)

我明白,你这样做:

git fetch
git log ..origin/master

但是,我猜origin/master 部分取决于分支?如果我正在跟踪远程分支,它不一定是 master?

我也不完全理解git merge origin/master。我猜这只是意味着git fetch 从远程获取更改并将它们作为原始/主服务器放入 git 数据库系统,而我只是主服务器?如果我获取了更改,检查了做了什么,对更改感到恐惧并且不想合并怎么办?我如何基本上放弃他们?

【问题讨论】:

  • 还有一件事:“origin master”是远程的,而“origin/master”是本地的?或者,这不相关吗?
  • 我认为使用新的 git 可能是 git log ..@{u}

标签: git


【解决方案1】:

git 获取

git fetch 从远程存储库中获取更改并将其放入存储库的对象数据库中。它还从远程存储库中获取分支并将它们存储为远程跟踪分支

当你获取 git 时,它会告诉你它将每个分支存储在它获取的远程存储库中的什么位置。例如,您应该看到类似

   7987baa..2086e7b  master -> origin/master

在获取时。这意味着 'origin/master' 存储 'master' 在 'origin' 存储库中的位置。

如果您检查.git/config 文件,您会看到以下片段:

[遥远的“起源”] url = git://git.example.com/repo.git fetch = +refs/heads/*:refs/remotes/origin/*

这(除其他外)意味着原始远程(您从中克隆的存储库)中的任何分支 'A' ('refs/heads/A') 都将保存为 'origin/A' ('refs/remotes/origin/ A')。

git log ..origin/master

如您所见,'origin/master' 是 'master' 的起源。如果你在(默认)'master'分支上,那么git log ..origin/master,相当于git log HEAD..origin/master,当在'master'分支上时相当于git log master..origin/master将列出所有在'master'分支上的提交远程存储库,并且不在您工作的本地“主”分支中。

现代 git 中更通用的版本(假设存在上游/跟踪信息)将简单地使用

$ git log ..@{u}

(这里@{u}@{upstream} 的同义词,参见gitrevisions 手册页)。

git 合并原点/master

git merge 用于连接两行历史。如果其中一方自最后一个分支点(自合并基础以来)没有做任何工作,则情况是 fast-forward (您所在的分支只是更新到您所在分支的尖端正在合并),或最新(没有什么新东西要合并,你所在的分支保持不变)。

git fetch后跟git merge origin/master,在'master'分支上,相当于发出

$ git pull

如果您不想合并,则不需要。请注意,您可以使用例如git reset --hard HEAD@{1} 如果您不喜欢它,请返回并丢弃 git pull 的结果。

【讨论】:

  • 这很清楚,感谢 Jakub;但是,假设我从远程获取,现在 origin/master 有一些变化,我“git log ..origin/master”看看做了什么,但我不想要它。如果我想再次合并,我必须让进行更改的人先恢复它,对吗?我想我也可以从以前的提交中获取一个文件,对吧?摆脱它,这样我就可以再次合并。
  • @Hans:对。 'origin/master' 中的内容不是你的,但它会跟踪 'origin' 存储库中的开发。最好使用功能分支进行开发,可以合并也可以不合并,而不是直接在主干上(在'master'中);我认为这需要同意你们中的谁是维护者,并将更改合并。为了避免合并来自“origin/master”的更改,您可以执行“--strategy=ours”合并,这会创建合并提交但获取您的结果;它在历史记录中保存了 'origin/master',但实际上丢弃它的结果。
  • 如何“撤消”是非常有用的信息,经常被忽略。
【解决方案2】:

git fetch 下载代表给定远程分支所需的所有更改。通常是origin/master 或类似名称。

git merge 通过创建新提交或快速转发(或组合)将两个分支合并在一起。它不会更改您所做的任何提交,并且您始终可以回滚到旧分支(使用 git resetgit checkout)。

请注意,git pullgit fetch 后跟 git merge(如果给定了 --rebase,则为 git rebase)。

【讨论】:

  • origin/master 只是对本地机器上未合并信息的引用吗?它不像遥远的东西那样“起源”?
  • 如果您决定不合并获取的更改,如何放弃它们?
  • @Hans,没有必要“放弃”更改;只是不要引用它们。如果您出于某种原因想要重置本地 origin/master 引用,请使用 git reset。你想达到什么目的? (一个 SVN 类比很好。)
  • @Hans:正确:origin/master 是对本地副本的本地引用,该副本是您获取时源的 master 所在位置的本地副本。 (称为远程分支。)不想合并就不要合并。
  • @strager(谢谢)我只是在想,如果我从某人那里拉取,检查更改,然后决定反对它们,但想再次拉取,那么我最终将不得不合并它们?我可以看到主题分支或其他内容的“git branch -d”,但是如果有人在我想要消除的 origin/master 中执行某些操作怎么办?
猜你喜欢
  • 2010-11-07
  • 2015-10-05
  • 2011-07-21
  • 2011-09-11
  • 2021-11-05
  • 2014-09-08
  • 2017-08-13
  • 1970-01-01
相关资源
最近更新 更多