我是git的新手。我了解一旦使用git add
添加新文件,我必须运行git commit
然后git push
。
前几天,我做了这件事并且惊讶地发现我的所有文件都没有签入,所以我想问下面这个问题:
一旦我git commit
,我怎么能确定在git push
之前确切地检查了什么?我可以复制一下我的项目,因为它会被推送到git吗?
答案 0 :(得分:7)
如果您在git status
之前运行git commit
,它会告诉您哪些更改将包含在提交中,哪些不会。
运行git commit
后,更改已经签入本地存储库。 Pushing不会检查它们,它只是使用您在本地存储库中提交的更新来更新另一个存储库。这与Subversion等集中式VCS不同。
在推动之前,有几种方法可以看到推动的内容:
git diff origin/master
会显示您当前状态与origin/master
之间的差异。git log origin/master..master
将列出要推送的提交,但不会显示其内容。答案 1 :(得分:3)
git show
将显示上次提交提交的详细信息。
如果有多个提交,您也可以使用
git diff origin/master
假设您的遥控器名为origin
,而您要推送的分支是master
。
答案 2 :(得分:2)
git diff
可以很好地处理您所做的更改。例如,您可以使用git diff origin/master
(如果您要推送的远程命名为origin)来查看当前分支与远程分支之间的差异。
另一种方法是使用git show
。如果您在本地进行了3次提交,则可以使用git show HEAD...HEAD~3
查看最近三次提交的内容。
更复杂(但容易混淆)的方法是使用whatchanged
:
git whatchanged -p --abbrev-commit --pretty=medium
我使用git别名填充,在shell中将其分配给gwc
。
答案 3 :(得分:1)
我为bash脚本使用别名:
我将脚本保存在我的主目录中的~/bin/git-outgoing
目录下面。我的~/bin/
位于PATH
;确保无论你把它放在哪里都可以访问,如果你打算别名它。
<强> git的出射强>:
#!/bin/sh
# Usage: git-outgoing [<upstream>] [<head> [<limit>]]
# Show commits on current branch that do not exist on branch <upstream>.
# bail out with message to stderr and exit status 1
die() {
echo "$(basename $0):" "$@" 1>&2
exit 1
}
# colors
SHA=$(git config --get-color 'color.branch.local')
ADD=$(git config --get-color 'color.diff.new')
REM=$(git config --get-color 'color.diff.old')
RESET=$(git config --get-color '' 'reset')
# get the current branch in refs/heads/<branch> form
ref=$(git symbolic-ref -q HEAD)
test -n "$ref" ||
die "you're not on a branch"
# just the branch name please
branch=$(echo "$ref" | sed 's@^refs/heads/@@')
test -n "$branch" ||
die "you're in a weird place; get on a local branch"
# use tracking branch if no upstream given
if [ $# -eq 0 ]
then
remote=$(git config --get "branch.$branch.remote" || true)
merge=$(git config branch.$branch.merge) ||
die "branch $branch isn't tracking a remote branch and no <upstream> given"
set -- "$remote/$(echo "$merge" |sed 's@^refs/heads/@@')"
fi
git cherry -v "$@" |
cut -c1-9,43- |
sed -e "s/^\(.\) \(.......\)/\1 $SHA\2$RESET/" |
sed -e "s/^-/$REM-$RESET/" -e "s/^+/$ADD+$RESET/"
这个附带的入站脚本进入~/bin/git-incoming
:
<强> git的入射强>:
#!/bin/sh
# Usage: git-incoming [--diff] [<upstream>] [<head> [<limit>]]
# Show commits on <upstream> that do not exist on current branch.
# bail out with message to stderr and exit status 1
die() {
echo "$(basename $0):" "$@" 1>&2
exit 1
}
# colors
SHA=$(git config --get-color 'color.branch.local')
ADD=$(git config --get-color 'color.diff.new')
REM=$(git config --get-color 'color.diff.old')
RESET=$(git config --get-color '' 'reset')
# check for -d / --diff argument
diff=false
if [ "$1" = '-d' -o "$1" = '--diff' ]
then diff=true
shift
fi
# use tracking branch if no upstream given
if [ $# -eq 0 ]
then
# get the current branch in refs/heads/<branch> form
ref=$(git symbolic-ref -q HEAD)
test -n "$ref" ||
die "you're not on a branch"
# just the branch name please
branch=$(echo "$ref" | sed 's@^refs/heads/@@')
test -n "$branch" ||
die "you're in a weird place; get on a local branch"
# grab remote name for current branch
remote=$(git config --get "branch.$branch.remote" || true)
# grab tracked branch name for current branch
merge=$(git config branch.$branch.merge) ||
die "branch $branch isn't tracking a remote branch and no <upstream> given"
# make it so
set -- "$remote/$(echo "$merge" |sed 's@^refs/heads/@@')"
fi
if $diff
then git diff HEAD..."$1"
else
git cherry -v HEAD "$@" |
cut -c1-9,43- |
sed -e "s/^\(.\) \(.......\)/\1 $SHA\2$RESET/" |
sed -e "s/^-/$REM-$RESET/" -e "s/^+/$ADD+$RESET/"
fi
在我的.gitconfig
中,我为此创建了一个别名:
[alias]
out = !git-outgoing
in = !git-incoming
现在,我可以在项目根目录中git out
查看要推送的内容,或git in
查看将要播放的内容。
这些是我发现的比我自己更好的脚本。我找不到作者,但会在我做的时候编辑。
答案 4 :(得分:0)
您可以采用多种方式,但最简单的方法是使用git log --stat
。它将显示已更改文件的摘要:
$ git log -2 --stat
commit 85318f521f6c0b9843d6da12abf67f2de7608431
Author: Junio C Hamano <gitster@pobox.com>
Date: Wed Jun 26 15:10:17 2013 -0700
Update draft release notes to 1.8.4
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/RelNotes/1.8.4.txt | 12 ++++++++++++
1 file changed, 12 insertions(+)
commit ad76feb55eb7645661421e213796129efcbb7d56
Merge: 12dd2f6 212eb96
Author: Junio C Hamano <gitster@pobox.com>
Date: Wed Jun 26 15:08:09 2013 -0700
Merge branch 'tr/maint-apply-non-git-patch-parsefix'
Fix for the codepath to parse patches that add new files, generated
by programs other than Git. THis is an old breakage in v1.7.11 and
will need to be merged down to the maintanance tracks.
* tr/maint-apply-non-git-patch-parsefix:
apply: carefully strdup a possibly-NULL name
这是git存储库中的一个示例。注意:默认情况下,合并提交不会显示任何内容。如果你想看到它们的统计数据,你需要传递--cc
选项(代表“紧凑组合”):
$ git log -2 --stat --cc
commit 85318f521f6c0b9843d6da12abf67f2de7608431
Author: Junio C Hamano <gitster@pobox.com>
Date: Wed Jun 26 15:10:17 2013 -0700
Update draft release notes to 1.8.4
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/RelNotes/1.8.4.txt | 12 ++++++++++++
1 file changed, 12 insertions(+)
commit ad76feb55eb7645661421e213796129efcbb7d56
Merge: 12dd2f6 212eb96
Author: Junio C Hamano <gitster@pobox.com>
Date: Wed Jun 26 15:08:09 2013 -0700
Merge branch 'tr/maint-apply-non-git-patch-parsefix'
Fix for the codepath to parse patches that add new files, generated
by programs other than Git. THis is an old breakage in v1.7.11 and
will need to be merged down to the maintanance tracks.
* tr/maint-apply-non-git-patch-parsefix:
apply: carefully strdup a possibly-NULL name
builtin/apply.c | 2 +-
t/t4111-apply-subdir.sh | 14 ++++++++++++++
2 files changed, 15 insertions(+), 1 deletion(-)
要查看更改的实际内容,您可以使用-p
上的git log
选项,或直接使用git show COMMIT_ID
查看提交。我更喜欢后者。 git show
也接受--stat
选项。
答案 5 :(得分:0)
启动gitk
或任何其他可视化历史浏览器:它显示您的分支和来源,提交中的差异,并提供所有其他工具以进行事后审核。