理解git fetch然后合并

Han*_*ans 60 git

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

相当于svn status -u的git

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

我明白,你这样做:

git fetch
git log ..origin/master
Run Code Online (Sandbox Code Playgroud)

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

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

Jak*_*ski 120

git fetch

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

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

   7987baa..2086e7b  master -> origin/master
Run Code Online (Sandbox Code Playgroud)

什么时候拿.这意味着'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'分支上的所有提交而不是本地'master '你在哪里工作.

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

$ git log ..@{u}
Run Code Online (Sandbox Code Playgroud)

(这@{u}是同义词@{upstream},请参阅gitrevisions手册页).

git merge origin/master

git merge用于连接两行历史记录.如果其中一方自上次分支点以来没有做任何工作(自合并基础以来),情况要么是快进的(你所在的分支只是更新到你正在合并的分支的尖端),或者向上 -到目前为止(合并没有新东西,你所在的分支保持不变).

git fetch然后git merge origin/master,在"主"分支上,相当于发行

$ git pull
Run Code Online (Sandbox Code Playgroud)

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


str*_*ger 5

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

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

需要注意的是git pullgit fetch后面git merge(或者git rebase如果--rebase给出).