# Welcome!

## git相关

**命令速查**

![](http://hpfblog-halo.oss-cn-hongkong.aliyuncs.com/blog-pictures/2021-08-25-095117.png)

***

廖雪峰git教程地址：<https://www.liaoxuefeng.com/wiki/896043488029600>

**版本回退**

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

***

**撤销修改**

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

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

场景3：已经提交了不合适的修改到版本库时，想要撤销本次提交，参考[版本回退](https://www.liaoxuefeng.com/wiki/896043488029600/897013573512192)一节，不过前提是没有推送到远程库。

**ps:**

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

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

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

总之，就是让这个文件回到最近一次`git commit`或`git add`时的状态。

***

**删除文件**

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

```
$ git rm test.txtrm '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:**&#x6DFB;加后，远程库的名字就是`origin`，这是Git默认的叫法，也可以改成别的，但是`origin`这个名字一看就知道是远程库。关联一个远程库时必须给远程库指定一个名字，`origin`是默认习惯命名；

* 关联后，使用命令`git push -u origin master`第一次推送master分支的所有内容；

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

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

**解除关联远程库**

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

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

然后，根据名字删除，比如删除`origin`：

```
$ git remote rm origin
```

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

***

**创建合并分支**

地址（讲的不错）：<https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424>

查看分支：`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>`

***

**解决冲突**

网址：<https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344>

**bug分支**

网址：<https://www.liaoxuefeng.com/wiki/896043488029600/900388704535136>

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

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

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

***

**git rebase 和 git merge**

原文地址：<https://www.jianshu.com/p/4079284dd970>

**为什么不要再公共分支使用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

<br>

Welcome to the company wiki! Here you'll find everything you need to know about the company.
