git使用小结(工作常用场景)(二)

前言:实习快半年,在这半年时间里,基本离不开git的使用,从一开始的一脸懵逼,到如今,不说精通,到也算是能应付上手了把。。。总之印证了那句话,“纸上得来终觉浅,得知此事须躬行”!!谨记。(不定期更新)

注:工作中用的是gitlab,毕竟不能啥都开源,但其内涵是和GitHub一致的。

 

场景一:copy远程仓库代码到本地,同将大象放入冰箱:  

1. git init  ##在本地新建空文件夹(强迫症行为)
2. git remote add origin ssh/http地址(github上复制)##将origin关联远程仓库
3. git remote -v ## 查看当前远程的版本,以及拥有的权限push or fetch
3. git pull origin master ## 拉取远程仓库到本地分支
4. git --set-upstream-to=origin/master master
## 首次本地分支不会关联任何远程分支,故此处关联远程分支origin/master到本地master分支(前一个为远程分支名,后一个为本地分支名)
5. git branch -vv ## 查看本地分支以及其关联的远程分支
6. git branch -a ## 查看所有的远程分支

注:关于git pull和git fetch的区别?权限里面只有fetch和push,没有pull??

### 考虑都有的时候在本地master上已经做了修改,
###    与远程master分支状态不一致,
###       此时不能直接把远程master分支拉到本地,
###          因此需要分为以下几个步骤进行,即有:

git pull origin master ## 等同于以下操作
####################### 分割线
1. git fetch origin master:temp 
## 在本地创建temp分支,并下载远端的origin/master分支到temp分支中
2. git diff temp ## 在本地分支master上查看与temp分支的版本差异
## 如果此时不再master分支上,需要 git checkout master
## 此时的版本差异主要有两种,
##        (1)在master上修改后经过add->commit操作:
#              正常情况下,本地master比远程master分支多了几次commit,此时无需合并,直接 git push origin master ,将本地分支master分支推送到远程分支上,然后直接删除temp分支就行了,git branch -d temp ;
##             特殊情况特殊对待,不展开,如本地master和远程master在两条分叉上(想象~~)
##        (2)在master上修改后经过add操作:
##             正常情况下,本地master和远程master分支处于同一个commit,此时修改还不想commit的话,可以先checkout一次,再将修改stash,即先git checkout .,然后git stash 。合并完后回复修改,直接git stash pop
##             特殊情况特殊对待,此处不展开
##        (3)在master上修改后没有经过任何git操作:直接stash,即git stash。合并完后回复修改,直接git stash pop
3. git merge temp ## 在master分支上执行,合并temp分支到本地master分支上
4. git branch -d temp ## 删除本地分支temp
#######################

以下场景都基于场景一!!

场景二:要换个远程分支进行修改了,即在本地切换到新的远程分支

 

git branch -a ##查看你拉去的远程分支
git checkout remote_branch 
## 此时本地会自动创建与远程分支一模一样的本地分支,并自动与远程分支关联,一本万利
## 如果本地分支不想与远程分支同名啥的,那就当成是重新拉取一边远程分支master,然后把相应参数的替换城远程分支的名字就行了

 

场景三:在gitlab上一般每个人都在自己的分支上工作。大家工作完都将修改merge到主分支上去,如master分支。因此,你拉取主分支master到本地后,通常需要创建自己的分支,并在其上进行工作。同时,为了方便后续合并到主分支上去,远程仓库也需要有对应与你的本地的分支。

git checkout -b local_branch ## 在主分支,如master上切换出一个本地分支local_name
## 此时local_branch只存在于本地,远程仓库并没有此分支
git push origin local_branch ## 推送本地分支到远程分支,此时远程会自动创建一个与本地一模一样的分支,并与本地分支关联起来

场景四:在gitlab上,一开始通常每个都从主分支上切出自己的分支,在自己的分支上工作上(场景三)。每一次修改后再提交到主分支上去。因此,每一次提交修改都要先与主分支同步,即:

## 本地和远程主分支都master,本地和远程工作分支都是为kachuan
1. git stash ##  在kachuan上保存没有经过add->commit修改,只是add的修改可以先commit
2. git checkout master ## 切换到本地master分支,并于远程mater分支同步
3. git pull origin master ## 如果已经关联了远程分支,直接git pull
4. git checkout kachuan ## 切换到kachuan分支上
5. git diff master ## 查看kachuan分支与最新主分支的区别
6. git mrege master ## 确认无误后合并主分支到本地分支kachun上
## 此时有两种情况:
##     1,master上的修改与当前kachuan的修改并无冲突,merge成功,此时merge就是一次commit操作,需要编辑commit信息,修改完成按:wq退出;
##     2, master上的修改与当前kachuan的修改冲突了,冲突的文件add失败,此时:
##        (1)git status  ## 查看冲突的文件,没有add的文件
##        (2)打开文本编辑器,修改冲突,冲突提示(夹在stash和箭头符号之间的内容属于你的修改,喜爱次截图)
##        (3)修改冲突后,git add conflict_file ,重新add冲突文件
##        (4)git commit -m ”commit内容"  ## commit修改
7. 上gitlab,"new merge request",选择从kachuan合并到master分支,并指派merge操作人
 

场景五:comit的内容不想要了,撤销commit的内容,并更新远程分支

1. git reset --hard HEAD~x 
## 将本地分支回退x个commit,或者git reset --hard,默认一个commit
## 或者:
##     git log ## 查看commit记录,复制要回退到的commit的commit id
##     git reset --hard commit_id ## 回退到指定commit
2. git push -f ## 更新远程仓库

20190315 更新

场景六:在本地分支开发新的功能时,不同的功能的commit交错执行,当leader说某个功能要“阉割”了,此时回退commit并不现实

## 看了很多资料,说的是cherry什么之类,但都不能达到想要的结果
## 直接reset有不甘心,说不定哪天有用上了呢
## 最后,只能采用蠢办法,直接将想要保留的功能的代码copy一遍,将即将丢弃的功能checkout到临时的本地分支上,具体如下:
1. git stash ## 将现有的修改stash起来
2. git checkout -b temp ## checkout新的分支temp,保留丢弃的功能
3. git checkout work_branch ## 切换回原先工作的分支 
4. git reset --hard commitid ## 通过git log查看将要回退到的commit id
5. 通过对比work_branch和temp分支的区别,copy想要保留的代码
6. git add . ## 添加修改后的文件
7. git commit -m "丢弃的功能" 
8. git stash pop ## 将一开始stash的修改还原回来

场景七:版本变化,分支重命名。

        如之前项目版本为V1,每个都在自己的分支下工作,完成后再提交merge request,指派负责人合并到master上。后来版本更新为V2,主分支不是master,而是v2了。有洁癖的人(比如我)不想每发布一个新的版本,就在本地和远程都创建一个新的分支,如linkachun_v2。我的做法是,远程仓库仍然只有linkachun一个分支,而本地为了保留之前版本,有两个分支linkachun,对应版本V1,linkachun_v2,对应版本V2。

 
git push origin :linkachuan_v2  ## 推送一个空的分支到远程分支linkachun_v2,即删除不想要的远程分支
git checkout -b linkachuan_v2 ## 在本地分支linkachuan上checkout出一个新的分支linkachuan_v2
## git branch -m linkachuan linkachuan_v2 (或者本地只保留一个分支linkachuan_v2)
git --set-upstream=origin/linkachuan linkachuan_v2 ## 将本地分支linkachuan_v2与远程分支linkachuan关联
git push orgin HEAD:linkachun ## 将本地分支linkachuan_v2的内容推送到远程分支linkachuan上

20190408 更新

场景八:对比前后代码

           在写web项目时,改了一堆文件fileA,fileB,fileC,其中改了配置fileC后报错了,这时想对比fileC改之前的结果,其他文件修改不想add-> commit,又要保留。

git add . ## 将所有modify的文件添加进来
git reset fileC ## fileC需要回退,好对比结果
git stash --keep-index ## 只备份没有add的文件
## -------------- debug完成后,回到原来的状态
git reset ## 将原先add的文件reset到原先的状态
git stash pop ## 还原fileC的修改

       

你可能感兴趣的:(Git)