工作区、缓冲区、远程仓库
git remote
和远程仓库关联
git init
git remote
git remote add origin master repo.git
fetch | clone | pull
从远程拉代码
git fetch:将remptes本地git里记录的远程仓库的commit信息给更新了,但是没有改变本地仓库的代码
git pull = git fetch + git merge
git branch
本地创建分支并更新到远程
git branch
git branch -r # 远程有的分支
git branch -a #
git checkout -b dev
# 将本地新建分支push到远程
git push --set-upstream origin dev
删除分支
#删除本地分支,要求不再本地分支上,
$ git branch -d branchname
#如果删除不掉(比如提示有未被归并的修改),尝试追加 -f(--force表示强制)
$ git branch -d branchname -f
#删除远程分支,提供两种方式(1 删除分支 2 推送空内容 等于删除)
$ git push origin --delete dev1
$ git push origin :dev1
merge
本地的dev分支 合并到 本地的master分支
# 从 dev 分支 切换到 master分支
$ git checkout master
# merge
$ git merge dev
# 删除本地的dev分支
$ git branch -d dev
一般用的比较多的就是 创建分支并切换到dev
git checkout master # 确保自己在master分支上
git checkout -b dev # 基于master分支创建dev分支,并切换到dev分支
git merge —no-ff
强制禁用
Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
合并分支时,加上—no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并
git merge的时候,会把dev上的commit id 合入master,并且产生一个merge的commit id
- 只处理一次冲突
- 引入了一次合并的历史记录,合并后的所有
commit
会按照提交时间从旧到新排列 - 所有的过程信息更多,可能会提高之后查找问题的难度
rebase:
在dev分支上,对master进行变基,解决完冲突后,使用git rebase —continue 合入
然后切换到master,将dev分支何如
此外rebase可以用来整合多个commit为一个,保持commit干净
git rebase -i HEAD~4
总结:
当需要保留详细的合并信息的时候建议使用git merge
,特别是需要将分支合并进入master
分支时;当发现自己修改某个功能时,频繁进行了git commit
提交时,发现其实过多的提交信息没有必要时,可以尝试git rebase
。
—amend & rebase
修改commit历史
https://www.yuque.com/yinzhi/blog/lfmcil#d653f1cb
# 修改上次commit信息
git commit --amend
# 合并某几次commit
git rebase -i HEAD~2 #前两次提交 进入修改界面即可看懂
rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
git rebase 和 merge 有啥区别
reset
丢弃commit
丢弃这几次的commit,将HEAD指针指向前某次提交
git reset —hard #commitid
撤销修改
直接用git checkout — xx 即可,其中—为必须的,否则就变成了切换到某分支。
备注:你需要谨慎的操作这个选项,因为一旦撤销无法恢复。这种也包括你把文件提交到暂存区,也会被撤销修改。
如果 你想撤销暂存区的修改内容,也可以看下,撤销暂存区的修改之后,其会把所有的修改返回工作区。
// 撤销某文件的修改
$ git checkout -- readme.txt
// 撤销文件夹的修改
$ git checkout <folder-name>/
# 撤销整个仓库 回到拉取时的状态
$ git reset --hard
// 查看分支状态 如果是已经修改,已经暂存,待push
$ git status
// 撤销暂存区的修改
$ git reset HEAD readme.txt
// 撤销暂存区所有的修改
$ git reset --hard HEAD
revert
撤销提交
当需要放弃的提交被合并后,我们想放弃该提交,需要先查看该提交的信息使用,执行指令git reflog
,我们找到需要撤销的提交,如最近第二个提交,提交commitId为dcbdde2,索引为HEAD@{19}:
//撤销某次提交
git revert head@{19}
//等效
git revert dcbdde2
//撤销提交时若多个提交修改了同一文件可能会出现冲突,需要处理冲突后,暂存:
git add .
//然后继续执行revert操作
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之后就可以保存此时的工作空间。也可以通过这个命令迅速找到此时的提交状态版本。
# 无需git add &commit 直接stash就可以临时保存当前改动的所有未提交的代码
$ git stash
# 开发完了其他分支后,在切回来还原临时保存的文件
$ git stash apply
git stash pop // 与 git stash apply 会将那个信息弹出
而apply可以反复使用那个信息
git cherry-pick
提选某几个提交
可以跨分支选其他分支的某几个提交合并到当前分支
# master分支切换到dev
git checkout dev
git log #查看dev上目标提交的commitid xxxid
# 切换回master分支
git cherry-pick xxxid
参考资料
git实用指南https://www.yuque.com/yinzhi/blog/lfmcil#b8180c6e
git小册 https://www.yuque.com/robinson/git/mrn4l6