Open 374632897 opened 8 years ago
commit message
如果发现上一次的commit message
里面有拼写错误或者其他错误, 需要更新提交信息的话, 可以使用git commit --amend -m "${message}"
来更新最新一次的提交信息。 git commit --amend
会用一个新的 commit 更新并替换最近的 commit, 参见
写代码写久了, 难免会出现一些意外。 当一不小心把一个不应该提交的东西提交到了Git仓库里的时候, 你可以使用 revert
或者reset
来撤销之前的提交。 那么什么是 revert, 什么是 reset , 又该如何选择一个合适的回退方式呢?
在当前工作目录干净的情况下(git status
不会看到未跟踪或者未提交的文件), 可以使用 revert 来撤销一个或者多个 commit , 并且会将这次撤销作为一个新的 commit 进行提交。
当撤销的commit 是一个 merge 的 commit 的时候,需要通过-m 选项来指定具体的 commit。
参考:
获取当前仓库下未提交或者未 track 的文件列表(过滤已删除文件)
git status -su | sed $'s,\x1b\[[0-9;]*m,,g' | awk '{if ($1 != "D") { print $2}}'
拷贝当前 HEAD 的 hash 值
git rev-parse HEAD | clipcopy
删除已 merge 的本地和远程分支
git checkout master
git branch --merged | \
sed $'s,\x1b\\[[0-9;]*m,,g' | \ # 移除 ANSI 字符 eg: \x1b[1;31m -> ''
egrep -v "master|release|test" | \
xargs -I{} bash -c "git push -d origin {} && git branch -D {}"
根据关键词快速前往分支
to () {
local branches=`git branch | \
sed $'s,\x1b\\[[0-9;]*m,,g' | \
grep -i "$1" --color=never`;
local count=`echo "$branches" | wc -l`;
if [[ "$count" -gt 1 ]]; then
echo
echo -e "\x1b[1;31m[WARNING]:Too much matched, please choose one of them:\x1b[0m\n";
echo "$branches"
else
# trim whitespace
git checkout `echo $branches`;
fi
}
一些常用命令
git commit -am "message"
: 用于添加并提交。git reset --hard <commit>
: 将当前分支恢复到指定的commitgit diff <branchname> --shortstat
: 显示分支和远程分支的diff信息, 具体如下所示:git diff <branchname> --name-only
: 该命令将会显示当前分支与指定分支相比发生变化的文件git reset
: 撤销刚才使用git add
添加的文件git reset --hard
: 使用这个参数将会彻底回退到某个历史版本git reset --soft
: 使用这个参数将会回退到某个版本, 但是只会回退commit的信息, 如果要继续提交, 直接commit即可。 当某次提交之后, 发现有些文件是需要另外处理的, 那么就可以回退到之前的版本, 处理后再重新commit。一些小技巧
恢复误删除分支
git log -g
获取到已删除分支的最后一次的commit
的哈希值git branch <branchname> <commit>
来从该commit
出新建一个分支。合并分支的时候, 将一个分支的所有提交合并为另一个分支的一个提交
git merge <branchname> --squash
关于.gitignore
忽略文件的最后不能跟分号
文件被跟踪后再修改.gitignore添加该文件以便不被记录 有时候可能会遇到这样的情况, 使用
git add .
然后将不需要添加的文件添加了, 之后才发现这个文件不应该被添加, 然后去修改.gitignore
文件, 结果之后对这个文件的更改依然会被记录进去。 然后出现的现象就是,.gitignore
并没有什么用。 事实上, gitignore只会在检测到目录中有未跟踪文件(untracked files
)的时候, 才会根据.gitignore
里面的通配符去匹配文件, 如果文件匹配, 将会忽略, 否则在使用git add
的时候, 就会将其添加进去, 从而变成跟踪文件, 也就是说, 在git add
一个文件之后, 那么只要这个文件发生了变化, 无论是更改还是删除, git都将会跟踪其变化, 所以这就造成了“add之后修改ignore, 但是并没有ignore”的现象了。 那么解决方案也是有的。 只需要取消对文件的跟踪就行了。如果是某个文件夹下的东西都不该被提交, 但是却被提交了, 那么可以添加
-r
选项来清除对该文件夹的跟踪。那么如果文件很多怎么办?比如有一大堆
*.class
文件, 这个时候就直接find
就可以咯。然后再执行
git add .
将这一次的更改添加进去, 之后再出现*.class
的时候就会被忽略掉了(前提是你在ignore里面添加了对应的匹配规则)