在我有git add和git commit之后,我的工作区,索引缓存和本地存储库变得相同。那么我怎么知道什么时候“推”,这个补丁集有什么区别?
答案 0 :(得分:5)
您可以尝试git diff origin/remote-branch-name..local-branch-name
或git log -p origin/branch-name..local-branch-name
。
如果您想比较您所在的当前分支,那么您可以不使用本地分支名称,即git diff origin/remote-branch-name..
,git log -p origin/branch-name..
。
答案 1 :(得分:2)
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/master
,origin/branch
,依此类推。如果他们没有任何新内容,git fetch
不会带来什么,也不会更新。所有origin/*
名称都存在,以便您的Git可以告诉您“这是我在其他Git中找到的内容,这是我最后一次与之交谈。”
当你跑步时:
git log -p origin/master..master
您正在指示您的Git查看master
上origin/master
以外的提交内容。那是你的 origin/master
- 所以它只是与你最近的git fetch
一样最新。
Git发送和接收提交,而不是补丁。 Git可以为您制作补丁,以便您可以通过电子邮件发送,但fetch
和push
可以处理提交。
使用git log
查看提交。添加-p
以查看普通(非合并)提交作为补丁:Git将在现场为您制作它们,以便您可以看到它们。添加--oneline
代替只看到提交主题行。
log
命令显示从您命名的位置开始提交,或者如果您没有命名,则显示从HEAD
提交。它一直持续到提交完成,或者当它达到你告诉它停止的提交时停止。那是origin/master..master
的意思。它告诉git log
:“从我的master
开始,到达我的origin/master
时停止。”这里需要两个点。
使用git diff
比较两个提交:git diff origin/master master
。如果您愿意,可以将其拼写为git diff origin/master..master
,但请注意,因为git diff
只是比较端点,跳过中间的所有提交。如果您不小心提交了一个大型电影文件,然后将其删除,git diff
将跳过该文件(但git log
不会!)。
使用origin/master
和其他origin/*
名称来查看Git上次从其他Git获取这些内容时所记得的内容。
运行git fetch
(或git fetch origin
)让您的Git再次与其他Git交谈并获取任何新内容。如果其他Git非常活跃,您可能需要经常这样做。如果它非常安静,或者是您自己的个人GitHub存储库,您可能从不需要这样做(因为您的Git也会在成功origin/master
时更新您自己的git push
等})。