git笔记

255 阅读6分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

git相关

命令速查

Git常用命令速查表


廖雪峰git教程地址:www.liaoxuefeng.com/wiki/896043…

版本回退

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

撤销修改

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

ps:

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。


删除文件

从版本库中删除该文件,用命令git rm删掉,并且git commit

$ git rm test.txt
rm 'test.txt'

$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- test.txt

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

ps:

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容


关联远程仓库

  • 要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

**ps:**添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。关联一个远程库时必须给远程库指定一个名字,origin是默认习惯命名;

  • 关联后,使用命令git push -u origin master第一次推送master分支的所有内容;

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。

**ps:**由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

解除关联远程库

如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm <name>命令。使用前,建议先用git remote -v查看远程库信息:

$ git remote -v
origin  git@github.com:michaelliao/learn-git.git (fetch)
origin  git@github.com:michaelliao/learn-git.git (push)

然后,根据名字删除,比如删除origin

$ git remote rm origin

此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。


创建合并分支

地址(讲的不错):www.liaoxuefeng.com/wiki/896043…

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>或者git switch <name>

创建+切换分支:git checkout -b <name>或者git switch -c <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>


解决冲突

网址:www.liaoxuefeng.com/wiki/896043…

bug分支

网址:www.liaoxuefeng.com/wiki/896043…

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。


git rebase 和 git merge

原文地址:www.jianshu.com/p/4079284dd…

为什么不要再公共分支使用rebase? 因为往后放的这些 commit 都是新的,这样其他从这个公共分支拉出去的人,都需要再 rebase,相当于你 rebase 东西进来,就都是新的 commit 了

  • 1-2-3 是现在的分支状态
  • 这个时候从原来的master ,checkout出来一个prod分支
  • 然后master提交了4.5,prod提交了6.7
  • 这个时候master分支状态就是1-2-3-4-5,prod状态变成1-2-3-6-7
  • 如果在prod上用rebase master ,prod分支状态就成了1-2-3-4-5-6-7
  • 如果是merge 1-2-3-6-7-8 ........ |4-5|
  • 会出来一个8,这个8的提交就是把4-5合进来的提交

merge和rebase实际上只是用的场景不一样 更通俗的解释一波. 比如rebase,你自己开发分支一直在做,然后某一天,你想把主线的修改合到你的分支上,做一次集成,这种情况就用rebase比较好.把你的提交都放在主线修改的头上 如果用merge,脑袋上顶着一笔merge的8,你如果想回退你分支上的某个提交就很麻烦,还有一个重要的问题,rebase的话,本来我的分支是从3拉出来的,rebase完了之后,就不知道我当时是从哪儿拉出来的我的开发分支 同样的,如果你在主分支上用rebase, rebase其他分支的修改,是不是要是别人想看主分支上有什么历史,他看到的就不是完整的历史课,这个历史已经被你篡改了

常用指令

  • git rebase -I dev 可以将dev分支合并到当前分支 这里的”-i“是指交互模式。就是说你可以干预rebase这个事务的过程,包括设置commit message,暂停commit等等。

  • git rebase –abort 放弃一次合并

  • 合并多次commit操作: 1 git rebase -i dev 2 修改最后几次commit记录中的pick 为squash 3 保存退出,弹出修改文件,修改commit记录再次保存退出(删除多余的change-id 只保留一个) 4 git add . 5 git rebase --continue

    正常开发流程

1.git checkout -b fix-1221 //新建并转到分支 
//进行代码开发
当我想从远程仓库里拉取一条本地不存在的分支时:


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

这个将会自动创建一个新的本地分支,并与指定的远程分支关联起来。

例如远程仓库里有个分支dev2,我本地没有该分支,我要把dev2拉到我本地:

若成功,将会在本地创建新分支dev2,并自动切到dev2上
 
如果出现提示:

fatal: Cannot update paths and switch to branch 'dev2' at the same time.
Did you intend to checkout 'origin/dev2' which can not be resolved as commit?

表示拉取不成功。我们需要先执行
git fetch
然后再执行

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

2.git add . // 将本地修改文件加入暂存区
3.git commit -m"修改内容"  //提交日志
4.git  push origin/remote-debug-api   // 提交到自己分支远程端
5.git checkout master  // 切换到主分支  (建议操作到这里的时候利用git  branch  查看一下本地分支有哪些)
6.git pull origin master  // 将本地主分支代码更新,建议加上origin master,这样不必更新其他分支的代码
7.git checkout  self-branch  //切换到自己分支
7.git  rebase master  //将主分支代码合并更新到自己分支 不建议merge
//8.git  checkout  master //切换到主分支
//9.git  merge  self-branch   // 将自己代码合并更新到本地主分支master
//10.git  push  //  将本地代码推到远程主分支master上   
//  到这里已经实现了将本地代码推送合并到远程master主分支上了,但为了下次继续开发可以切换到自己开发分支上
//11.git  checkout self-branch

git add .
git commit -m "修改内容"
git  push origin/remote-debug-api 

远程gitlab进行合并请求操作
合并多个commit

git rebase -i HEAD~2 接着进入vim编辑界面,除了第一行的pick不变外,其他pick都改为squash

接着再进入vim编辑界面,把后3个commit都删除,并编辑第一条commit作为合并后的commit

最后,强制覆盖远程分支的内容:

git push origin debug-api -f