git提交
git rm (删除运作加入了暂存区)
git add -u (将本地有改动包括修改和删除的文件标记到暂存区)
git提交日志
git log --oneline --decorate(旁边显示该提交关联的引用里程碑或分支)
--graph 图形模式
-p (具体改动)
--stat (输出变更概要)
-- sourcefile
--author=
git重置(默认重置暂存区)
用法一:git reset [-q] [<commit>] [--] <paths>...
指定提交状态commit下的文件paths替换掉暂存区中的文件
用法二:git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
--hard:版本库覆盖暂存区和工作区
--mixed(默认):版本库覆盖暂存区
--soft:只是版本库master指针回滚
用reflog挽救错误的重置
git reflog show master | head -5
git reset --hard master@{2}
git检出(覆盖工作区)
用法一:git checkout [-q] [<commit>] [--] <paths>...
省略commit则会用暂存区文件覆盖工作区的文件,否则用指定提交指定文件覆盖暂存区和工作区中对应的文件
用法二:git checkout [<branch>]
改变HEAD头指针,切换分支用
用法三:git checkout [-m] [[-b|--orphan] <new_branch>] [<start_point>]
主要是创建和切换到新的分支new_branch,新的分支从start_point指定的提交开始创建。
head重置即检出
挽救分离头指针,“分离头指针”状态指的就是HEAD头指针指向了一个具体的提交ID,而不是一个引用(分支)。用git rev-parse HEAD master指向不同。git merge commitid,使用合并操作合并分离后的提交到master上来
差异比较
比较里程碑B和里程碑A,用命令:git diff B A
比较工作区和里程碑A,用命令:git diff A
比较暂存区和里程碑A,用命令:git diff --cache A
比较工作区和暂存区,用命令:git diff
比较暂存区和HEAD,用命令:git diff --cached
比较工作区和HEAD,用命令:git diff HEAD
文件不同版本的差异比较:git diff <commit1> <commit2> -- <paths>
恢复进度
git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet] [<message>]] (保存当前的工作进度,会分别对暂存区和工作区的状态进行保存)
--patch(会显示工作区和HEAD的差异,通过对差异文件的编辑决定在进度中最终要保存的工作区内容)
--keep-index,在保存进度后不会将暂存区重置。默认会将暂存区和工作区强制重置
git stash list (显示进度列表)
git stash pop [--index] [<stash>] 从stash列表中恢复stash,恢复完毕后从进度列表中删除
git stash apply [--index] [<stash>] 同上,只是不从进度列表中删除
git stash drop [<stash>] 删除某进度
git stash clear 删除所有进度
git stash branch <branchname> <stash> 基于进度创建分支
文件追溯:git blame
git blame -L 6,+5 paths
二分查找定位引起BUG的commit
先确定HEAD是“坏提交”,确定某次提交G为“好提交”
git bisect start
git bisect bad
git bisect good G
当定位到某个commit is the first bad commit时,git checkout bisect/bad切换到该版本,当对BUG定位和修复完成后,撤销二分查找在版本库中遗留的临时文件和引用。撤销二分查找后,版本库切换回执行二分查找之前所在的分支。
git bisect reset
修补式提交
悔棋:git commit --amend 修改最近的一次提交
多步悔棋:git reset --soft HEAD^^ git commit -m '****'
回到未来
git tag F | E HEAD^ | D HEAD^^ | C HEAD^^^ | B HEAD~4 | A HEAD~5
去掉坏提交D
git log --oneline --decorate -6
git checkout C
git cherry-pick master^ 拣选回E
git cherry-pick master 拣选回F
git checkout master
git reset --hard HEAD@{1}
冲突解决
git merge [option] <commit>可以是提交ID引用(分支、里程碑)
将commit对应的目录树和当前工作分支的目录树的内容进行合并,合并后的提交以当前分支的提交作为第一个父提交,以<commit>为第二个父提交,还支持将多个<commit>代表的分支和当前分支进行合并,默认合并结果会自动提交,但是如果提供--no-commit选项,则合并后的结果会放入暂存区,用记可以对合并结果进行检查、更改,然后手动提交。
-m 可以查看合并操作所做出的修改
git mergetool合并工具
分支
git branch 显示本地分支列表
git branch <branchname>|<branchname> <start-point>
git branch -d|-D <branchname>
git branch -m|-M <oldbranch> <newbranch>
git show-ref 可以看到全部本地引用
本地分支共享到远程库
git push origin service
复用某次提交message
git commit -C <commit>
跟踪分支
git checkout -b [branch] [remotename]/[branch] 或
git checkout --track origin/serverfix
添加远程仓库
git remote add <shortname> <url>
查看远程分支
git remote show (remote)
删除远程分支
git push origin --delete serverfix