记录git的一些用法

314 阅读5分钟

查看commit内容

git showgit 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

可以对某一段线性提交历史进行编辑、删除、复制、黏贴。 场景:

  1. 合并多个commit为一个commit git rebase i [startpoint] [endpoint](默认head)前开后闭区间。
    然后会进入编辑器,pick commitId commit message,pick开头是保留提交内容,把pick改成f,则会组合commit到上一个commit里,把pick改成s,可以组合这些提交,并重命名这个提交。
  2. 将某一段commit黏贴到另一个分支上 git rebase [startpoint] [endpoint] --onto [branchName]前开后闭区间 然后把branchName(例如master)的分支所指的提交id设置为endpoint的提交id git 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