git在本地分为三个区域,工作区、暂存区和本地仓库,具体情况如下:
git的一般操作就是本地代码的修改提交回滚,以及与远程仓库的拉取、合并、提交等。
git fetch 从远程仓库上抓取分支到本机origin的dev分支上
git merge 将origin上的分支合并到工作区的dev分支上
git pull 相当于前两个命令合在一起
#切换到master分之后,将dev分支合并到master分支
git checkout master
git merge dev
当本地仓库向远程仓库push失败的时候,先从远程仓库上fetch下最新的代码merge到本地的分支上,然后才能push
当fetch下来的代码与本地仓库的分支代码merge时发生冲突的话,需要解决掉冲突文件中的冲突再push。冲突文件这时已经被git程序更改,标记了冲突的位置。此时可以查看git status根据提示来操作,具体的做法:
1,若想回到没有更改前,即merge前,执行git merge --abort。再进行想要的操作。
2,可以直接更改冲突文件,然后git add file 然后git commit,再push
对于工作区、暂存区、本地仓库代码的差异比较
diff 用于对比差异
git diff 默认用于比较工作区和暂存区之间的差异
git diff --cached 和git diff --staged比较暂存区和本地仓库的差异
git diff HEAD 是工作区与本地仓库的差异
查看帮助 git merge --help 或者git help merge
对于分支相关的操作
git branch 查看所有分支
git branch -v 查看所有分支详细信息
git branch branchname 新建分支
git branch -d branchname 删除分支
git checkout branchname 切换分支
git checkout -b branchname 创建新分支并切换到新分支
git checkout -- filename 把工作区的修改撤销,还原到修改前的暂存区的文件的内容(如果修改前已经add到暂存区),或者还原到本地仓库的文件的内容(修改前没有add到暂存区)。即把暂存区或者本地仓库的最近一次的提交检出到工作区使文件的更改撤销,让文件回到最后一次add或commit的状态。
git checkout versionid filename 可以将工作区某个文件还原到指定版本的那个文件的内容
具体场景:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,可以分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
在Git中,用HEAD表示当前版本,也就是最新的commit的那个版本。上一个版本就是HEAD^,上上一个版本就是HEAD^^。也可以用数字HEAD~,HEAD~2
关于reset的几个参数
git reset --mixed HEAD~ 将HEAD指针指向上一个版本,同时将本地仓库改变后的HEAD的指向的内容覆盖到暂存区
git reset HEAD~ 同上,默认是--mixed
git reset --hard HEAD~ 将HEAD指针指向上一个版本,同时将本地仓库HEAD的指向的内容同时覆盖到暂存区和工作区
git reset --soft HEAD~ 只将本地仓库的HEAD指针指向上一个版本,其他不做改变。
对于回滚来说:
reset是针对的commit级别的操作,移动HEAD指针,同时可能会影响到暂存区和工作区
checkout改变的是工作区的内容,reset改变的可能是工作区、暂存区和HEAD指针的内容
git revert versionid 来使本地仓库的内容回到指定的版本内容。与reset的不同是,如果reset要回到以前的某个版本,则HEAD指针移到指定的版本的位置,此后的commit则不显示在git log里面了。而revert则是把它当做一次commit,即把工作区的内容修改成指定版本的内容然后add和commit了。
git cherry-pick versionid 经常用于将某个分支上的某次commit合并到master上,而分支的其他commit暂时不合并。(比如修复bug的commit)
git merge和git rebase
两者最终结果相似,都是将分支合并,不过合并过程和方式不同。
上图:执行git merge master,把master分支合并到dev分支上
若是执行git rebase,就会将原来dev的两次提交d和e添加到master分支后面,变成d‘和e’。若有冲突的话,修改后使用git add 和git rebase --continue即可。过程中任何时候可以使用git rebase --abort来终止rebase操作回到原来的状态
其余还有一些命令,比如git log、git config等等,不写了。