理解git fetch然后合并

时间:2010-08-05 22:18:05

标签: git

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

git equivalent of svn status -u

(等同于svn status -u

的git是什么

我理解,你这样做:

git fetch
git log ..origin/master

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

我也不完全理解git merge origin/master。我猜这只是意味着git fetch从远程获取更改并将它们作为origin / master放入git数据库系统中,我只是掌握了?如果我获取更改,检查已完成的内容,是否因更改而感到恐惧并且不想合并,该怎么办?我怎么基本上放弃他们?

2 个答案:

答案 0 :(得分:116)

git fetch

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

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

的内容
   7987baa..2086e7b  master -> origin/master
提取时

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

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

[remote "origin"]
        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 merge origin / master

git merge用于连接两行历史记录。如果其中一方自上次分支点以来没有做任何工作(自合并基础以来),情况就是快进(您所在的分支只是更新到分支的顶端)正在合并),或最新(合并没有新东西,你所在的分支保持不变)。

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

$ git pull

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

答案 1 :(得分:5)

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

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

请注意,git pullgit fetch,后跟git merge(如果已发出git rebase,则为--rebase