git常用备忘录 - 图2

工作区、缓冲区、远程仓库

git常用备忘录 - 图3

git remote

和远程仓库关联

  1. git init
  2. git remote
  3. git remote add origin master repo.git

fetch | clone | pull

从远程拉代码
image.png
git fetch:将remptes本地git里记录的远程仓库的commit信息给更新了,但是没有改变本地仓库的代码
git pull = git fetch + git merge

git branch

本地创建分支并更新到远程

  1. git branch
  2. git branch -r # 远程有的分支
  3. git branch -a #
  4. git checkout -b dev
  5. # 将本地新建分支push到远程
  6. git push --set-upstream origin dev

删除分支

  1. #删除本地分支,要求不再本地分支上,
  2. $ git branch -d branchname
  3. #如果删除不掉(比如提示有未被归并的修改),尝试追加 -f(--force表示强制)
  4. $ git branch -d branchname -f
  5. #删除远程分支,提供两种方式(1 删除分支 2 推送空内容 等于删除)
  6. $ git push origin --delete dev1
  7. $ git push origin :dev1

merge

本地的dev分支 合并到 本地的master分支

  1. # 从 dev 分支 切换到 master分支
  2. $ git checkout master
  3. # merge
  4. $ git merge dev
  5. # 删除本地的dev分支
  6. $ git branch -d dev

一般用的比较多的就是 创建分支并切换到dev

  1. git checkout master # 确保自己在master分支上
  2. git checkout -b dev # 基于master分支创建dev分支,并切换到dev分支

git merge —no-ff

强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息

合并分支时,加上—no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并

image.png

git merge的时候,会把dev上的commit id 合入master,并且产生一个merge的commit id
image.png image.png

  • 只处理一次冲突
  • 引入了一次合并的历史记录,合并后的所有 commit 会按照提交时间从旧到新排列
  • 所有的过程信息更多,可能会提高之后查找问题的难度

rebase:
在dev分支上,对master进行变基,解决完冲突后,使用git rebase —continue 合入
然后切换到master,将dev分支何如
image.png

此外rebase可以用来整合多个commit为一个,保持commit干净

  1. git rebase -i HEAD~4

总结:
当需要保留详细的合并信息的时候建议使用git merge,特别是需要将分支合并进入master分支时;当发现自己修改某个功能时,频繁进行了git commit提交时,发现其实过多的提交信息没有必要时,可以尝试git rebase

—amend & rebase

修改commit历史

https://www.yuque.com/yinzhi/blog/lfmcil#d653f1cb

  1. # 修改上次commit信息
  2. git commit --amend
  3. # 合并某几次commit
  1. git rebase -i HEAD~2 #前两次提交 进入修改界面即可看懂

rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了

  • rebase操作可以把本地未push的分叉提交历史整理成直线;
  • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

git rebase 和 merge 有啥区别

reset

image.png

丢弃commit

丢弃这几次的commit,将HEAD指针指向前某次提交
git reset —hard #commitid

撤销修改

直接用git checkout — xx 即可,其中—为必须的,否则就变成了切换到某分支。

备注:你需要谨慎的操作这个选项,因为一旦撤销无法恢复。这种也包括你把文件提交到暂存区,也会被撤销修改。
如果 你想撤销暂存区的修改内容,也可以看下,撤销暂存区的修改之后,其会把所有的修改返回工作区。

  1. // 撤销某文件的修改
  2. $ git checkout -- readme.txt
  3. // 撤销文件夹的修改
  4. $ git checkout <folder-name>/
  5. # 撤销整个仓库 回到拉取时的状态
  6. $ git reset --hard
  7. // 查看分支状态 如果是已经修改,已经暂存,待push
  8. $ git status
  9. // 撤销暂存区的修改
  10. $ git reset HEAD readme.txt
  11. // 撤销暂存区所有的修改
  12. $ git reset --hard HEAD

revert

撤销提交

当需要放弃的提交被合并后,我们想放弃该提交,需要先查看该提交的信息使用,执行指令git reflog ,我们找到需要撤销的提交,如最近第二个提交,提交commitId为dcbdde2,索引为HEAD@{19}:

  1. //撤销某次提交
  2. git revert head@{19}
  3. //等效
  4. git revert dcbdde2
  5. //撤销提交时若多个提交修改了同一文件可能会出现冲突,需要处理冲突后,暂存:
  6. git add .
  7. //然后继续执行revert操作
  8. git revert --continue

git reflog

撤销修改

本地修改 —— git add —— git commit —— 远程

1、当仅仅是本地修改时:git checkout — file
2、add之后即添加到了暂存区: git reset HEAD file , 回到1,再执行1的操作
3、commit之后
gti log —pretty=oneline
git reset —hard HEAD^ ( hard 参数:
或:git reset —hard commitId

  • 加了—hard,那么撤销的 commit 的代码也会消失掉
  • 同时撤销远程提交:git push -f origin master

改了之后又想从历史回到现在?
git reflog

git stash & git apply

临时保存

当你正在开发一个分支,但是这个分支还未完全开发好,不能提交到dev,需要临时保存。那么需要提交到本地仓库,然后stash之后就可以保存此时的工作空间。也可以通过这个命令迅速找到此时的提交状态版本。

  1. # 无需git add &commit 直接stash就可以临时保存当前改动的所有未提交的代码
  2. $ git stash
  3. # 开发完了其他分支后,在切回来还原临时保存的文件
  4. $ git stash apply
  5. git stash pop // git stash apply 会将那个信息弹出
  6. apply可以反复使用那个信息

git cherry-pick

提选某几个提交

可以跨分支选其他分支的某几个提交合并到当前分支

  1. # master分支切换到dev
  2. git checkout dev
  3. git log #查看dev上目标提交的commitid xxxid
  4. # 切换回master分支
  5. git cherry-pick xxxid

参考资料

git实用指南https://www.yuque.com/yinzhi/blog/lfmcil#b8180c6e
git小册 https://www.yuque.com/robinson/git/mrn4l6