查看commit内容
git show或git log -n1 -p;
都能查看到commit的message,修改的文件,修改的具体内容。
git log只能看到message,author,date
git reflog可以看到分支的所有操作记录,包括reset和已经被删除的commit记录。
HEAD,HEAD^1和HEAD^的区别
HEAD就是当前本地分支指向的提交,如果没有reset过,那么HEAD就是当前本地分支指向的最新提交,如果reset到上一次提交,那么HEAD就是当前本地分支指向的上一次提交。HEAD^和HEAD^1是统一意义,是HEAD的指向的上一次提交,即比HEAD往后一步指向。所以要对版本操作时,最好操作commitId,会更准确,否则HEAD只是一个相对的位置。
未push时,修改commit message
git commit --amend --only -m 'xxxx'
删除最后一次提交,已push
git reset HEAD^ --hard
git push -f [remote] [branch] 这会改变远程分支的历史
或
git revert SHAofBadCommit(commit号)这会创建一个新的提交,用于撤销前一个提交的所有变化
删除最后一次提交,未push
git reset --soft HEAD@{1}
删除任意远程提交
git rebase --onto SHA1_OF_BAD_COMMIT^ SHA1_OF_BAD_COMMIT
git push -f [remote] [branch]
git rebase
可以对某一段线性提交历史进行编辑、删除、复制、黏贴。 场景:
- 合并多个commit为一个commit
git rebase i [startpoint] [endpoint](默认head)前开后闭区间。
然后会进入编辑器,pick commitId commit message,pick开头是保留提交内容,把pick改成f,则会组合commit到上一个commit里,把pick改成s,可以组合这些提交,并重命名这个提交。 - 将某一段commit黏贴到另一个分支上
git rebase [startpoint] [endpoint] --onto [branchName]前开后闭区间 然后把branchName(例如master)的分支所指的提交id设置为endpoint的提交idgit checkout master``git reset --hard [endpoint]但是要提交到远程时,需要force push,因为远程分支不接受这些快进了的提交,所以合并代码一般使用merge,而不是rebase。 只是复制一两个提交到其他分支,推荐使用git cherry-pick
意外做了一次hard reset,想找回reset前的内容
通过git reflog查看提交记录,再用git reset --hard commitId重置一遍
revert,reset,checkout的区别
- revert是用新的提交回滚之前的操作,reset是直接删除之前的提交
- revert是将HEAD向前移动一下,reset是将HEAD向后移动
- revert可以跨多个版本进行操作,reset是连版本操作
- revert没有文件层面的操作,reset和checkout都可以操作回退某个文件。reset可以回退历史版本的文件,包括将暂存的文件回退到工作目录,但不能将工作目录的内容回退,checkout只能回退工作目录的文件,即撤销文件的修改 工作目录|缓存区|本地仓库|提交历史 -|-|-|-| 未add|add|commit|push|
| 操作 | 选项 | 作用 |
|---|---|---|
| reset | --soft | 保留未add内容,指定commitId的版本到最新版本改动的文件会放在缓存区,执行git reset HEAD,可将缓存区的修改撤销,重新放到工作去,即变成--mixed |
| - | --mixed(默认) | 保留未add内容,指定commitId的版本到最新版本改动的文件都放到工作目录,可以执行rm删除,则变成--hard |
| - | --hard | 不保留未add内容,工作目录和缓存区都同步到你指定的提交 |
撤销rebase/merge
git reset --hard ORIG_HEADgit在进行危险操作的时候,会把原始的HEAD保存在一个叫ORIG_HEAD的变量里,所以要把分支恢复到rebase/merge前的状态是很容易的。
把暂存内容添加到上一次的提交commit,并且可以修改上一次的commit message
git commit --amend -m
暂存一个新文件的一部分,而不是这个文件的全部
git add --patch [fileName]
打开交互模式之后,可以选择s来分割代码块。如果是新文件,则需要
git add -N [fileNamw],然后选择e来手动选择需要添加的项。
执行git diff --cached会显示哪些代码暂存了哪些代码还在工作目录。
将工作目录修改的内容暂存到堆栈区,工作目录将恢复未修改前的状态
git stash
可以暂存某个文件的某些内容
git stash -p
把堆栈区的内容恢复回工作目录中,栈是先进后出
git stash pop
丢弃堆栈区的内容
git stash drop
将未暂存的内容移动到另一个分支
git checkout [branchName]或
git stash``git checkout [branchName]``git stash pop
丢弃本地目录所有文件的修改
git checkout -f
本来应该分布不同分支的commit,不小心都提交到了同一个分支上,要把这些commit分到不同分支上
git log查看commitid,如bug1Id,bug2Id,原本id
git reset --hard 原本id
git checkout -b bug1
git cherry-pick bug1Id
思路就是,把错误提交的分支回退到正常提交版本,把错误提交的commit,用cherry-pick提交到合适的分支上
一旦远程主机的版本库有了更新,需要将这些更新取回本地
git fetch
git fetch -p删除不存在的远程跟踪分支,即远程分支不存在了,本地的该分支也要相应删掉。
安全合并策略
git merge --no-commit [branchName],执行merge,但不自动提交,给用户在做提交前检查和修改的机会。
merge的时候,可将多个commit合并成一个commit,且自定义commit message
feature-1.0.0分支上有多个commit,现在要将它合并到master上,最后master的log记录,就只会有“修复了xxx”
git merge --squash feature-1.0.0
git commit -m '修复了xxx'
git push origin master