Git操作指南

55 阅读6分钟
  1. 我们在做项目版本开发时,经常需要根据版本,先创建一新分支v + 版本号:如v2.4
  2. 然后在此工作分支上进行开发,开发完毕后,需要将代码合并到dev上进行测试发布。

〇、常用命令

git status

git branch -vv   查看本地分支与远程仓库关联情况

// 推送本地的feature-branch(冒号前面的)分支到远程origin的feature-branch(冒号后面的)分支
// 没有会自动创建
git push origin feature-branch:feature-branch   

// 拉取远程分支到本地并切换到该分支
git checkout -b dev origin/dev

// 将本地分支关联到远程分支
git branch --set-upstream-to=origin/develop develop

// 解除关联
git branch --unset-upstream

// 拉取代码
// git pull <远程主机名> <远程分支名>:<本地分支名>
git pull origin master
// 等价于以下两步
git fetch origin master //从远程主机的master分支拉取最新内容 
git merge FETCH_HEAD    //将拉取下来的最新内容合并到当前所在的分支中

一、合并原则:

  1. 在工作分支v2.4上,commit 代码
  2. 切换到dev分支,git pull拉取最新代码
  3. 切换到工作分支v2.4,将dev代码merge或rebase到当前工作分支,有冲突就解决冲突。
  4. 再切换到dev分支,将工作分支代码合并到dev分支上即可。

什么时候用merge,什么时候用rebase?

1、主分支合并子分支用merge

2、子分支合并主分支,用rebase。否则会产生一条“Merge branch 'master' into dev-work”的提交记录,污染了提交日志。  注:有的人习惯不用rebase,可以保留开发的分支结构

git rebase参考:彻底搞懂 Git-Rebase

总结:这样的处理在于,一定是从高版本合并到低版本,否则会出现各种问题

二、合并操作

具体思路:先拉取一份最新的远程代码到本地,然后将本地两个版本的代码合并,最后发布一份新版本代码到远程。

1、查看远程仓库:

git remote -v 

2、 比如,在步骤一中,我们查看到远程有一个叫origin的仓库,我们可以使用如下命令从origin远程仓库获取最新版本的代码。

git fetch origin dev:temp 

上面代码的意思是:从远程的origin仓库的dev分支下载到本地,并新建一个temp分支。

3、将temp分支和本地分支合并

git merge temp 

现在,B的B分支本地代码已经和远程仓库dev处于同一个版本了,接下来去代码中消除冲突,并提交新版本到远程dev代码库。

4、上面的步骤中我们创建了temp分支,删除temp分支,命令如下:

git branch -d temp

三、丢弃本地修改

三种情况如下所示:

  1. 还未将变更从工作区加入到暂存区,即未执行git add 命令
// 此时可以使用git checkout命令来撤销修改,如:
git checkout -- rainbow.txt start.txt
git checkout -- *
git checkout -- *.txt
  1. 已将变更加入到暂存区,即已经执行了git add命令
// 此时可以使用git reset命令来撤销修改,如:

git reset HEAD rainbow.txt start.txt
git reset HEAD  *
git reset HEAD *.txt

注意:执行以上命令后,本地的修改并不会消失,而只是从暂存区回到了工作区,即第一种情况下所示的状态。继续用第一种情况下的操作,就可以放弃本地的修改。

  1. 已经将代码提交到本地仓库,即已经执行git commit命令,此时工作区已经clean,若想撤销之前的修改,
// 需要执行版本回退操作:
#回退到上一个版本
git reset --hard HEAD^
#回退到上上次版本
git reset --hard HEAD^^
git reset --hard HEAD^^^

# 回退到指定commitid的版本
// 使用 git log 或 git reflog 命令来查看git的提交历史,获取commit_id
git reset --hard  commit_id

四、暂存代码

git stash 是一个非常有用的命令,它可以将当前分支的工作现场暂存起来,以便在切换分支或者处理其他任务时,可以随时恢复现场。

下面是一些常用的 git stash 相关命令以及简要的解释:

git stash save "save message" // 将当前内容暂存
git stash list   // 列出当前分支下的所有 stash。
git stash show stash@{n}  //查看指定的 stash 中的修改内容。
git stash apply stash@{n}  //将指定的 stash 中的修改应用到当前分支下。
git stash pop  //将最新的 stash 中的修改应用到当前分支下,并从 stash 列表中移除该 stash。
git stash drop stash@{n}  //移除指定的 stash。
git stash clear  //移除当前分支下的所有 stash。

五、拉取代码

1、需要本地分支和远程分支建立映射关系

git checkout -b 本地分支名xxx origin/远程分支名xxx

使用这种方式会在本地仓库新建分支xxx,并自动切换到新建的分支xxx,当然了远程分支xxx的代码也拉取到了本地分支xxx中。

采用这种方法建立的本地分支会和远程分支建立映射关系。

2、不需要本地分支和远程分支建立映射关系

git fetch origin 远程分支名xxx:本地分支名xxx

使用这种方式会在本地仓库新建分支xxx,但是并不会自动切换到新建的分支xxx,需要手动checkout,当然了远程分支xxx的代码也拉取到了本地分支xxx中。

采用这种方法建立的本地分支不会和远程分支建立映射关系。

六、合并commit

推荐使用Android Studio中的可视化操作界面,方便快捷不易出错

# 如果想合并最近三次提交
git rebase -i HEAD~3

# 这会打开你的默认文本编辑器并显示最近 3 个提交的列表,类似:
# (在下面三次提交中,A是最新一次的提交,C是最早一次的提交)
pick a9c8a1d Commit message C
pick fb1b2e3 Commit message B
pick 4c3d7e1 Commit message A

# 要将这些提交 squash 到上一个提交中,将 "pick" 改为 "squash" 或者 "s"
pick a9c8a1d Commit message C
squash fb1b2e3 Commit message B
squash 4c3d7e1 Commit message A

# 保存并关闭编辑器,会执行rebase流程,然后打开一个新的编辑器,在这个编辑器中,可以修改本次合并后的commit信息。

注意:squash只能往上一个提交中合并。

比如想合并A和B两笔提交,那么要修改A的pick 为 squash,而不能修改B的。如果修改了B的,那么含义是:将B合并到上一笔提交C中。