如何知道“git push”会推动哪些差异?

时间:2016-12-02 07:29:03

标签: git git-commit git-push

在我有git add和git commit之后,我的工作区,索引缓存和本地存储库变得相同。那么我怎么知道什么时候“推”,这个补丁集有什么区别?

3 个答案:

答案 0 :(得分:5)

您可以尝试git diff origin/remote-branch-name..local-branch-namegit log -p origin/branch-name..local-branch-name

如果您想比较您所在的当前分支,那么您可以不使用本地分支名称,即git diff origin/remote-branch-name..git log -p origin/branch-name..

答案 1 :(得分:2)

git-diff

结合使用
git diff origin/master [ <local-branch-name> ]

您可能正在寻找

git push --dry-run --verbose

这将模拟推送并打印您在途中需要的所有信息。来自git man page

git-push:
-v
--verbose

    Run verbosely.

-n
--dry-run

    Do everything except actually send the updates.

答案 2 :(得分:0)

Rashmirathi's answer是正确的(并且已经投票)但是这里有一个关键点:当你运行git push时,你不发送补丁,你发送完整提交

这是一个简单的例子:

$ cd /tmp
$ git clone upstream.git downstream
Cloning into 'downstream'...
done.
$ cd downstream
$ echo 'add stuff to the readme file' >> README
$ git add README
$ git commit -m 'make a mistake'
[master 20caf72] make a mistake
 1 file changed, 1 insertion(+)

现在我们有一个我们不想要的提交,所以我们不做我们所做的改变(我可以简单git revert HEAD但我想以更复杂的方式做到这一点。)

$ ed README
48
$d
w
19
q

(这会删除文件的最后一行README

$ git add README
$ git commit -m 'un-make the mistake'
[master b0ebc79] un-make the mistake
 1 file changed, 1 deletion(-)

(我们现在准备推动)

$ git push origin master
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 440 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To [path]/upstream.git
   49c7832..b0ebc79  master -> master
$ 

即使根本没有实际的变化,我仍然只是推了两次提交。让我们转到上游(裸)存储库,看看:

$ cd ../upstream.git
$ git log --oneline
b0ebc79 un-make the mistake
20caf72 make a mistake
49c7832 initial

确实,他们在那里。

因此,正确的问题不是“我将发送什么补丁”,而是“我将发送提交”。大多数情况下,这并没有太大的区别,但是如果你不小心提交了一个4千兆字节的视频文件,那么提交删除同一个文件, diff 从“他们有什么”到“你的最新提交“可能很小,而提交你将发送包括一个非常大的提交。

还有一个稍微模糊的一点,就是你的origin/master(或origin/branch,如果你正在使用branch)是基于你的 Git的关于其他上游Git分支的最新知识。上游可能还有其他变化。如果是这样,你想看到它,还是想忽略它?如果你希望看到它,你将不得不选择 想要看到它 - 并且在某些时候你可能 停止忽视它。

要更新您自己的Git关于其他Git上的内容的想法,您可以运行git fetch origin,它会带来您不具备的任何新的 ,然后更新您的origin/masterorigin/branch,依此类推。如果他们没有任何新内容,git fetch不会带来什么,也不会更新。所有origin/*名称都存在,以便您的Git可以告诉您“这是我在其他Git中找到的内容,这是我最后一次与之交谈。”

当你跑步时:

git log -p origin/master..master

您正在指示您的Git查看masterorigin/master以外的提交内容。那是你的 origin/master - 所以它只是与你最近的git fetch一样最新。

关键外卖

  1. Git发送和接收提交,而不是补丁。 Git可以为您制作补丁,以便您可以通过电子邮件发送,但fetchpush可以处理提交。

  2. 使用git log查看提交。添加-p以查看普通(非合并)提交作为补丁:Git将在现场为您制作它们,以便您可以看到它们。添加--oneline代替只看到提交主题行。

    log命令显示从您命名的位置开始提交,或者如果您没有命名,则显示从HEAD提交。它一直持续到提交完成,或者当它达到你告诉它停止的提交时停止。那是origin/master..master的意思。它告诉git log:“从我的master开始,到达我的origin/master时停止。”这里需要两个点。

  3. 使用git diff比较两个提交:git diff origin/master master。如果您愿意,可以将其拼写为git diff origin/master..master,但请注意,因为git diff只是比较端点,跳过中间的所有提交。如果您不小心提交了一个大型电影文件,然后将其删除,git diff将跳过该文件(但git log不会!)。

  4. 使用origin/master和其他origin/*名称来查看Git上次从其他Git获取这些内容时所记得的内容。

  5. 运行git fetch(或git fetch origin)让您的Git再次与其他Git交谈并获取任何新内容。如果其他Git非常活跃,您可能需要经常这样做。如果它非常安静,或者是您自己的个人GitHub存储库,您可能从不需要这样做(因为您的Git也会在成功origin/master时更新您自己的git push等})。