Git 操作备忘
Git 操作备忘
特别推荐:https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1
git
批量移除文件
- git rm *.suo 移除一类文件;
设置Git的user name和email:
$ git config —global user.name “norman.zheng”
$ git config —global user.email “norman.zheng@vipshop.com”
生成SSH
- 查看是否已经有SSH密钥了:cd ~/.ssh用此命令进入后ls查看,如果有则备份删除。
- 生成命令
$ ssh-keygen -t rsa -C “norman.zheng@vipshop.com”
- 然后按三个回车,密码设置为空。最后生成了两个文件
id_rsa
和id_rsa.pub
vi命令编辑模式查看公钥,并复制.pub文件,粘贴到gitlab里即可
添加密钥到ssh
ssh-add
文件名
需要之前输入密码。- 在github上添加ssh密钥,这要添加的是“id_rsa.pub”里面的公钥。
变基
- git rebase 会将当前分支的提交复制到指定的分支之上。
- 变基与合并有一个重大的区别:Git 不会尝试确定要保留或不保留哪些文件。我们执行 rebase 的分支总是含有我们想要保留的最新近的修改!这样我们不会遇到任何合并冲突,而且可以保留一个漂亮的、线性的 Git 历史记录。
交互式变基。在我们正在
rebase -i HEAD~xx
的提交上,我们可以执行以下 6 个动作:
- reword:修改提交信息;
- edit:修改此提交;
- squash:将提交融合到前一个提交中;
- fixup:将提交融合到前一个提交中,不保留该提交的日志消息;
- exec:在每个提交上运行我们想要 rebase 的命令;
- drop:移除该提交。
软重置
git reset --soft HEAD~xx
保留变动,回滚到某个commit
还原(Reverting)另一种撤销修改的方法是执行 git revert。通过对特定的提交执行还原操作,我们会创建一个包含已还原修改的新提交。
git revert xxxx
撤销commitId的变动。并直接生成一个新的commitID(merge后的)
拣选(Cherry-picking)当一个特定分支包含我们的活动分支需要的某个提交时,我们对那个提交执行 cherry-pick!对一个提交执行 cherry-pick 时,我们会在活动分支上创建一个新的提交,其中包含由拣选出来的提交所引入的修改。
通过在这个远程分支上执行 git fetch,我们就可在本地获取这些修改。这不会以任何方式影响你的本地分支:fetch 只是单纯地下载新的数据而已。
尽管 git fetch 可用于获取某个分支的远程信息,但我们也可以执行 git pull。git pull 实际上是两个命令合成了一个:git fetch 和 git merge。当我们从来源拉取修改时,我们首先是像 git fetch 那样取回所有数据,然后最新的修改会自动合并到本地分支中。
git reflog 是一个非常有用的命令,可以展示已经执行过的所有动作的日志。包括合并、重置、还原,基本上包含你对你的分支所做的任何修改。
git patch生成
$ git format-patch HEAD^ #生成最近的1次commit的patch
$ git format-patch HEAD^^ #生成最近的2次commit的patch
$ git format-patch HEAD^^^ #生成最近的3次commit的patch
$ git format-patch HEAD^^^^ #生成最近的4次commit的patch
$ git format-patch <r1>..<r2> #生成两个commit间的修改的patch(生成的patch不包含r1. <r1>和<r2>都是具体的commit号)
$ git format-patch -1 <r1> #生成单个commit的patch
$ git format-patch <r1> #生成某commit以来的修改patch(不包含该commit)
$ git format-patch --root <r1> #生成从根到r1提交的所有patch
应用patch
- git am会直接将patch的所有信息打上去,而且不用重新git add和git commit,author也是patch的author而不是打patch的人。
- git apply是另外一种打patch的命令,其与git am的区别是:git apply并不会将commit message等打上去,打完patch后需要重新git add和git commit。
检查patch的情况
$ git apply --stat 0001-limit-log-function.patch # 查看patch的情况
$ git apply --check 0001-limit-log-function.patch # 检查patch是否能够打上,如果没有任何输出,则说明无冲突,可以打上
打patch场景之一使用git diff生成的patch
$ git apply xxx.patch
打patch场景之二使用git format-patch生成的patch
$ git am 0001-limit-log-function.patch # 将名字为0001-limit-log-function.patch的patch打上
$ git am --signoff 0001-limit-log-function.patch # 添加-s或者--signoff,还可以把自己的名字添加为signed off by信息,作用是注明打patch的人是谁,因为有时打patch的人并不是patch的作者
$ git am ~/patch-set/*.patch # 将路径~/patch-set/*.patch 按照先后顺序打上
$ git am --abort # 当git am失败时,用以将已经在am过程中打上的patch废弃掉(比如有三个patch,打到第三个patch时有冲突,那么这条命令会把打上的前两个patch丢弃掉,返回没有打patch的状态)
$ git am --resolved # 当git am失败,解决完冲突后,这条命令会接着打patch