|
|
|
@ -4,309 +4,339 @@ Git是一款免费、开源的分布式版本控制系统,用于敏捷高效
|
|
|
|
|
|
|
|
|
|
通过Git可以从服务器克隆完整的Git仓库(包括代码和版本信息)到单机上,然后根据不同开发目的灵活创建分支、修改代码、提交代码、合并分支等。
|
|
|
|
|
|
|
|
|
|
## Git常用命令
|
|
|
|
|
|
|
|
|
|
**表1** Git常用命令
|
|
|
|
|
|
|
|
|
|
**命令**
|
|
|
|
|
|
|
|
|
|
**功能**
|
|
|
|
|
|
|
|
|
|
**格式**
|
|
|
|
|
|
|
|
|
|
**参数说明**
|
|
|
|
|
|
|
|
|
|
**使用实例**
|
|
|
|
|
|
|
|
|
|
ssh –keygen –t rsa
|
|
|
|
|
|
|
|
|
|
生成密钥
|
|
|
|
|
|
|
|
|
|
ssh –keygen –t rsa –C \[email\]
|
|
|
|
|
|
|
|
|
|
email:邮箱地址
|
|
|
|
|
|
|
|
|
|
在C盘.ssh文件夹下获取密钥文件“id\_rsa.pub”
|
|
|
|
|
|
|
|
|
|
ssh –keygen –t rsa –C "devcloud\_key01@XXX.com"
|
|
|
|
|
|
|
|
|
|
git branch
|
|
|
|
|
|
|
|
|
|
新建分支。
|
|
|
|
|
|
|
|
|
|
git branch \[new branchname\]
|
|
|
|
|
|
|
|
|
|
new branchname:新的分支名
|
|
|
|
|
|
|
|
|
|
新建分支:
|
|
|
|
|
|
|
|
|
|
git branch newbranch
|
|
|
|
|
|
|
|
|
|
git branch –D
|
|
|
|
|
|
|
|
|
|
删除分支
|
|
|
|
|
|
|
|
|
|
git branch –D \[new branchname\]
|
|
|
|
|
|
|
|
|
|
new branchname:新的分支名
|
|
|
|
|
|
|
|
|
|
删除本地分支:
|
|
|
|
|
|
|
|
|
|
git branch –D newbranch
|
|
|
|
|
|
|
|
|
|
删除服务器仓库分支
|
|
|
|
|
|
|
|
|
|
git branch –rd origin/newbranch
|
|
|
|
|
|
|
|
|
|
同步远端已删除的分支
|
|
|
|
|
|
|
|
|
|
git remote prune origin
|
|
|
|
|
|
|
|
|
|
git add
|
|
|
|
|
|
|
|
|
|
添加文件到暂存区。
|
|
|
|
|
|
|
|
|
|
git add \[filename\]
|
|
|
|
|
|
|
|
|
|
filename:文件名
|
|
|
|
|
|
|
|
|
|
添加一个文件到暂缓区:
|
|
|
|
|
|
|
|
|
|
git add filename
|
|
|
|
|
|
|
|
|
|
添加所有修改的和新增的文件到暂缓区:
|
|
|
|
|
|
|
|
|
|
自己在工作中常用的git命令行!
|
|
|
|
|
|
|
|
|
|
## <a name="basic">Git基本操作</a>
|
|
|
|
|
## 用户信息
|
|
|
|
|
当我们要进行Git提交的时候,我们作为提交者要以什么姓名和电子邮件地址进行提交?
|
|
|
|
|
```shell
|
|
|
|
|
git config --global user.name "EENOT"
|
|
|
|
|
git config --global user.email admin@eenot.com
|
|
|
|
|
```
|
|
|
|
|
## 查看配置信息
|
|
|
|
|
```shell
|
|
|
|
|
git config --list
|
|
|
|
|
```
|
|
|
|
|
上面命令配置好的用户信息可以通过`git config --list`命令查看用户名、邮箱、别名、remote地址等等!真是一览无遗!当然也可以到.git目录下的查看config文件
|
|
|
|
|
|
|
|
|
|
## 从现有的仓库克隆到本地
|
|
|
|
|
```shell
|
|
|
|
|
git clone https://github.com/DefaultYuan/Git-Pro.git A/B
|
|
|
|
|
```
|
|
|
|
|
以上命令是将现有的仓库克隆到**A目录下的B文件夹**里面,如果后面没有添加**A/B**就会默认新建一个名为**Git-Pro**文件夹,且将仓库克隆到这个文件夹下面!
|
|
|
|
|
|
|
|
|
|
## 提交代码到本地仓库
|
|
|
|
|
当我们在本地修改了文件,比如修改了`README.md`文件,我们首先查看状态确定哪些文件当前处于什么状态!
|
|
|
|
|
```shell
|
|
|
|
|
git status
|
|
|
|
|
```
|
|
|
|
|
该命令执行完终端输出如下:
|
|
|
|
|
```shell
|
|
|
|
|
On branch master
|
|
|
|
|
Your branch is up-to-date with 'origin/master'.
|
|
|
|
|
Changes not staged for commit:
|
|
|
|
|
(use "git add <file>..." to update what will be committed)
|
|
|
|
|
(use "git checkout -- <file>..." to discard changes in working directory)
|
|
|
|
|
|
|
|
|
|
modified: README.md
|
|
|
|
|
|
|
|
|
|
no changes added to commit (use "git add" and/or "git commit -a")
|
|
|
|
|
```
|
|
|
|
|
当前`README.md`文件是有做修改的,该文件还没有添加到stage的,提示我们可以通过**git add <file>**来添加,当然我们也可以通过**git checkout -- <file>**来撤销本次做到修改,建议不要轻易这么干!后续我会讲讲相关撤销操作。
|
|
|
|
|
|
|
|
|
|
现在我们加入stage
|
|
|
|
|
```shell
|
|
|
|
|
git add README.md
|
|
|
|
|
```
|
|
|
|
|
如果我们现在要将本地所有修改的文件进行添加,可以用该命令:
|
|
|
|
|
```shell
|
|
|
|
|
git add .
|
|
|
|
|
|
|
|
|
|
git rm
|
|
|
|
|
|
|
|
|
|
删除本地目录或文件。
|
|
|
|
|
|
|
|
|
|
git rm \[filename\]
|
|
|
|
|
|
|
|
|
|
filename:文件名或目录名
|
|
|
|
|
|
|
|
|
|
删除文件:
|
|
|
|
|
|
|
|
|
|
git rm filename
|
|
|
|
|
|
|
|
|
|
git clone
|
|
|
|
|
|
|
|
|
|
克隆远程仓库。
|
|
|
|
|
|
|
|
|
|
git clone \[VersionAddress\]
|
|
|
|
|
|
|
|
|
|
VersionAddress:版本库的网址。
|
|
|
|
|
|
|
|
|
|
克隆**jQuery**的版本库:
|
|
|
|
|
|
|
|
|
|
git clone https://github.com/jquery/jquery.git
|
|
|
|
|
|
|
|
|
|
该命令会在本地主机生成一个目录,与远程主机的版本库同名。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
最后,我们进行提交
|
|
|
|
|
```shell
|
|
|
|
|
git commit -m "fix 具体哪个功能"
|
|
|
|
|
```
|
|
|
|
|
如果本地我们改的内容有点多,涉及到修改多个模块的代码,建议多次添加并提交!
|
|
|
|
|
|
|
|
|
|
## 将本地代码提交到远程仓库
|
|
|
|
|
继上面的提交操作之后<br>
|
|
|
|
|
我们先拉取一下远程仓库的更新内容
|
|
|
|
|
```shell
|
|
|
|
|
git fetch
|
|
|
|
|
```
|
|
|
|
|
接下来,我们就可以手动`merge`远程仓库的修改了
|
|
|
|
|
```shell
|
|
|
|
|
git merge
|
|
|
|
|
```
|
|
|
|
|
我们为了让我们的提交记录比较美观一些的话,在这里我们会用`rebase`去代替`merge`操作
|
|
|
|
|
```shell
|
|
|
|
|
git rebase
|
|
|
|
|
```
|
|
|
|
|
或者用`pull`来拉取代码
|
|
|
|
|
```shell
|
|
|
|
|
git pull
|
|
|
|
|
```
|
|
|
|
|
`fetch`跟`pull`有啥区别呢?<br>
|
|
|
|
|
`fetch`从远程仓库抓取到本地之后不会自动`merge`操作,但`pull`会自动`merge`
|
|
|
|
|
|
|
|
|
|
把远程仓库的分支pull到本地,再与本地的指定分支合并。
|
|
|
|
|
|
|
|
|
|
git pull \[RemoteHostname\] \[RemoteBranchname\]:\[LocalBranchname\]
|
|
|
|
|
|
|
|
|
|
\-
|
|
|
|
|
|
|
|
|
|
取回“origin”主机的“next”分支,与本地的“master”分支合并:
|
|
|
|
|
|
|
|
|
|
git pull origin next:master
|
|
|
|
|
|
|
|
|
|
git diff
|
|
|
|
|
|
|
|
|
|
文件、分支、目录或版本的比较。
|
|
|
|
|
|
|
|
|
|
git diff
|
|
|
|
|
|
|
|
|
|
\-
|
|
|
|
|
|
|
|
|
|
当前与“master”分支的比较:
|
|
|
|
|
|
|
|
|
|
git diff master
|
|
|
|
|
|
|
|
|
|
git commit
|
|
|
|
|
|
|
|
|
|
文件提交。
|
|
|
|
|
|
|
|
|
|
git commit
|
|
|
|
|
|
|
|
|
|
\-
|
|
|
|
|
|
|
|
|
|
添加提交信息:
|
|
|
|
|
|
|
|
|
|
git commit –m "commit message"
|
|
|
|
|
|
|
|
|
|
最后我们进行`push`操作
|
|
|
|
|
```shell
|
|
|
|
|
git push
|
|
|
|
|
|
|
|
|
|
推送文件到远程仓库。
|
|
|
|
|
|
|
|
|
|
git push \[RemoteHostname\] \[LocalBranchname\] \[RemoteBranchname\]
|
|
|
|
|
|
|
|
|
|
\-
|
|
|
|
|
|
|
|
|
|
如果省略远程分支名,则表示将本地分支推送与之存在“追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建:
|
|
|
|
|
|
|
|
|
|
git push origin master
|
|
|
|
|
|
|
|
|
|
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
|
|
|
|
|
|
|
|
|
|
git merge
|
|
|
|
|
|
|
|
|
|
合并分支。
|
|
|
|
|
|
|
|
|
|
git merge \[branch\]
|
|
|
|
|
|
|
|
|
|
branch:分支名
|
|
|
|
|
|
|
|
|
|
假设当前分支为“develop”,将master主分支之后的最新提交merge到当前的develop分支上:
|
|
|
|
|
|
|
|
|
|
git merge master
|
|
|
|
|
|
|
|
|
|
git checkout
|
|
|
|
|
|
|
|
|
|
切换分支。
|
|
|
|
|
|
|
|
|
|
git checkout \[branchname\]
|
|
|
|
|
|
|
|
|
|
branchname:分支名
|
|
|
|
|
|
|
|
|
|
切换到master分支:
|
|
|
|
|
|
|
|
|
|
git checkout master
|
|
|
|
|
|
|
|
|
|
git log
|
|
|
|
|
|
|
|
|
|
列出日志信息。
|
|
|
|
|
|
|
|
|
|
git log
|
|
|
|
|
|
|
|
|
|
\-
|
|
|
|
|
|
|
|
|
|
列出所有的log:
|
|
|
|
|
|
|
|
|
|
git log –-all
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
这样我们就可以做到远程仓库和本地仓库的同步了!
|
|
|
|
|
***
|
|
|
|
|
## Git进阶
|
|
|
|
|
上面讲的是一些[**Git**基本操作](#basic)。<br>
|
|
|
|
|
接下来讲讲一些Git进阶小技巧
|
|
|
|
|
|
|
|
|
|
## 提交技巧
|
|
|
|
|
##### 当我们要将`stage`里的修改分多次提交到本地仓库,也就是具体到哪个文件
|
|
|
|
|
```shell
|
|
|
|
|
git commit DefaultYuan.txt -m "fix 具体功能"
|
|
|
|
|
```
|
|
|
|
|
##### 如果我们想查看要提交的内容与版本库中的比较,然后进行提交
|
|
|
|
|
```shell
|
|
|
|
|
git commit -v
|
|
|
|
|
```
|
|
|
|
|
##### 将工作区和`stage`中的所有修改的文件一次性提交到本地仓库
|
|
|
|
|
```shell
|
|
|
|
|
git commit -a
|
|
|
|
|
```
|
|
|
|
|
这样会默认使用 vi 添加描述,我们也可以在`.git/config`的`core`中`editor = vim`指定编辑器<br>
|
|
|
|
|
当然也可以使用`-m`选项直接添加提交信息
|
|
|
|
|
```shell
|
|
|
|
|
git commit -a -m "fix 具体功能"
|
|
|
|
|
```
|
|
|
|
|
##### 有时候我们需要对上一次提交信息进行修改
|
|
|
|
|
```shell
|
|
|
|
|
git commit --amend
|
|
|
|
|
```
|
|
|
|
|
也可以后面添加参数`-m`做到修改
|
|
|
|
|
## 查看状态
|
|
|
|
|
##### 查看工作区中所有目录下文件的变动
|
|
|
|
|
```shell
|
|
|
|
|
git status
|
|
|
|
|
|
|
|
|
|
查看状态输出。
|
|
|
|
|
|
|
|
|
|
git status
|
|
|
|
|
|
|
|
|
|
\-
|
|
|
|
|
|
|
|
|
|
git status
|
|
|
|
|
|
|
|
|
|
git grep
|
|
|
|
|
|
|
|
|
|
查找字符串。
|
|
|
|
|
|
|
|
|
|
git grep
|
|
|
|
|
|
|
|
|
|
\-
|
|
|
|
|
|
|
|
|
|
查找是否有“hello”字符串:
|
|
|
|
|
|
|
|
|
|
git grep "hello"
|
|
|
|
|
|
|
|
|
|
git show
|
|
|
|
|
|
|
|
|
|
显示内容或修改的内容。
|
|
|
|
|
|
|
|
|
|
git show
|
|
|
|
|
|
|
|
|
|
\-
|
|
|
|
|
|
|
|
|
|
* git show v1
|
|
|
|
|
|
|
|
|
|
显示“tag v1”的修改内容
|
|
|
|
|
|
|
|
|
|
* git show HEAD
|
|
|
|
|
|
|
|
|
|
显示当前版本的修改文件
|
|
|
|
|
|
|
|
|
|
* git show HEAD^
|
|
|
|
|
|
|
|
|
|
显示前一版本所有的修改文件
|
|
|
|
|
|
|
|
|
|
* git show HEAD~4
|
|
|
|
|
|
|
|
|
|
显示前4版本的修改文件
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
git stash
|
|
|
|
|
|
|
|
|
|
暂存区。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
##### 比较工作区与暂存区的改动
|
|
|
|
|
```shell
|
|
|
|
|
git diff
|
|
|
|
|
```
|
|
|
|
|
##### 添加参数`--cached`,比较暂存区和版本库之间的区别
|
|
|
|
|
```shell
|
|
|
|
|
git diff --cached
|
|
|
|
|
```
|
|
|
|
|
##### 添加参数`HEAD`,比较工作区、暂存区和版本库之间的区别
|
|
|
|
|
```shell
|
|
|
|
|
git diff HEAD
|
|
|
|
|
```
|
|
|
|
|
`HEAD`关键字它指的是当前分支的最新提交,相当于一个**指针**,后续讲到新建分支也会提到它
|
|
|
|
|
## `stash`的使用
|
|
|
|
|
有时候我们在工作区进行开发并且不想提交的时候,这时我们又想`pull`最新代码;或者又想切到另外一个分支上修改紧急bug的时候<br>
|
|
|
|
|
**git stash**可以暂存当前的工作区内容
|
|
|
|
|
##### 可以先暂存当前的工作区的内容
|
|
|
|
|
```shell
|
|
|
|
|
git stash
|
|
|
|
|
|
|
|
|
|
\-
|
|
|
|
|
|
|
|
|
|
* git stash
|
|
|
|
|
|
|
|
|
|
用于保存和恢复工作进度
|
|
|
|
|
|
|
|
|
|
* git stash list
|
|
|
|
|
|
|
|
|
|
列出暂存区的文件
|
|
|
|
|
|
|
|
|
|
* git stash pop
|
|
|
|
|
|
|
|
|
|
取出最新的一笔,并移除
|
|
|
|
|
|
|
|
|
|
* git stash apply
|
|
|
|
|
|
|
|
|
|
取出但不移除
|
|
|
|
|
|
|
|
|
|
* git stash clear
|
|
|
|
|
|
|
|
|
|
清除暂存区
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
git ls-files
|
|
|
|
|
|
|
|
|
|
查看文件。
|
|
|
|
|
|
|
|
|
|
git ls-files
|
|
|
|
|
|
|
|
|
|
\-
|
|
|
|
|
|
|
|
|
|
* git ls-files –d
|
|
|
|
|
|
|
|
|
|
查看已经删除的文件
|
|
|
|
|
|
|
|
|
|
* git ls-files –d |xargs git checkout
|
|
|
|
|
|
|
|
|
|
将已删除的文件还原
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
git remote
|
|
|
|
|
|
|
|
|
|
操作远程。
|
|
|
|
|
|
|
|
|
|
git remote
|
|
|
|
|
|
|
|
|
|
\-
|
|
|
|
|
|
|
|
|
|
* git push origin master:newbranch
|
|
|
|
|
|
|
|
|
|
增加远程仓库的分支
|
|
|
|
|
|
|
|
|
|
* git remote add newbranch
|
|
|
|
|
|
|
|
|
|
增加远程仓库的分支
|
|
|
|
|
|
|
|
|
|
* git remote show
|
|
|
|
|
|
|
|
|
|
列出现在远程有多少版本库
|
|
|
|
|
|
|
|
|
|
* git remote rm newbranch
|
|
|
|
|
|
|
|
|
|
删除远程仓库的新分支
|
|
|
|
|
|
|
|
|
|
* git remote update
|
|
|
|
|
|
|
|
|
|
更新远程所有版本的分支
|
|
|
|
|
```
|
|
|
|
|
等我们切到另外分支修改完了bug之后,可以切回之前分支
|
|
|
|
|
##### 然后恢复之前工作区的内容继续开发
|
|
|
|
|
```shell
|
|
|
|
|
git stash pop
|
|
|
|
|
```
|
|
|
|
|
##### 也可以查看`stash`的Git栈信息
|
|
|
|
|
```shell
|
|
|
|
|
git stash list
|
|
|
|
|
```
|
|
|
|
|
当我们的`stash`栈列表里面有很多,并且我们想要找到对应的版本号
|
|
|
|
|
##### 并且将我们想要的版本号为**stash@{2}**的工作内容取出来
|
|
|
|
|
```shell
|
|
|
|
|
git stash apply stash@{2}
|
|
|
|
|
```
|
|
|
|
|
##### 也可以查看版本号为**stash@{2}**的工作内容
|
|
|
|
|
```shell
|
|
|
|
|
git stash show stash@{2}
|
|
|
|
|
```
|
|
|
|
|
当我们的`stash`栈列表的工作内容都应用回来的时候
|
|
|
|
|
##### 可以将栈清空
|
|
|
|
|
```shell
|
|
|
|
|
git stash clear
|
|
|
|
|
```
|
|
|
|
|
## 分支
|
|
|
|
|
分支在Git里面是比较廉价的,我们在开发的时候可以在本地仓库创建很多条分支
|
|
|
|
|
##### 新建一条名字为dev的分支
|
|
|
|
|
```shell
|
|
|
|
|
git branch dev
|
|
|
|
|
```
|
|
|
|
|
这种创建方式会依然停留在当前分支
|
|
|
|
|
##### 开发新功能、或者修改bug,我们会创建一条分支并切到新开分支上开发
|
|
|
|
|
```shell
|
|
|
|
|
git checkout -b dev_fixHot
|
|
|
|
|
```
|
|
|
|
|
##### 也可以从当前分支新建一个dev分支,指向指定`commit`
|
|
|
|
|
```shell
|
|
|
|
|
git branch dev f0299e2
|
|
|
|
|
```
|
|
|
|
|
`f0299e2`是随便写的,具体要以我们自己的`commit`
|
|
|
|
|
##### 切换到指定分支
|
|
|
|
|
```shell
|
|
|
|
|
git checkout dev
|
|
|
|
|
```
|
|
|
|
|
分支其实也是指向某个`commit`的指针,`HEAD`也是一个指针,它指向当前工作目录下的`commit`<br>
|
|
|
|
|
因此`checkout`就是让`HEAD`指向dev分支
|
|
|
|
|
##### 删除dev分支
|
|
|
|
|
```shell
|
|
|
|
|
git branch -d dev
|
|
|
|
|
```
|
|
|
|
|
##### 强制删除dev分支
|
|
|
|
|
```shell
|
|
|
|
|
git branch -D dev
|
|
|
|
|
```
|
|
|
|
|
##### 将本地dev分支与dev_fixHot远程分支建立追踪关系
|
|
|
|
|
```shell
|
|
|
|
|
git branch --set-upstream dev origin/dev_fixHot
|
|
|
|
|
```
|
|
|
|
|
##### 添加一个dev远程分支
|
|
|
|
|
```shell
|
|
|
|
|
git push origin dev:dev
|
|
|
|
|
```
|
|
|
|
|
##### 删除dev远程分支
|
|
|
|
|
```shell
|
|
|
|
|
git push origin :dev
|
|
|
|
|
```
|
|
|
|
|
或者<br>
|
|
|
|
|
```shell
|
|
|
|
|
git push origin --delete dev
|
|
|
|
|
```
|
|
|
|
|
##### 选择一个`commit`,合并到当前分支
|
|
|
|
|
```shell
|
|
|
|
|
git cherry-pick f0299e2
|
|
|
|
|
```
|
|
|
|
|
## 合并分支`rebase`和`merge`
|
|
|
|
|
####在工作中,如果团队开发同一个项目的人数特别多的时候,每个人都在自己的分支上开发<br>
|
|
|
|
|
在开发过程中,为了使提交记录直观,方便在一条分支上查看提交记录,可以对分支进行衍合,一般是在做了一些小的修改之后会用它<br>
|
|
|
|
|
将修改`commit`到本地分支上之后<br>
|
|
|
|
|
当本地分支上有相对应的远程分支,可以直接使用
|
|
|
|
|
```shell
|
|
|
|
|
git rebase
|
|
|
|
|
```
|
|
|
|
|
为了方便讲解,`origin/dev_homepageFix`这个远程分支是随便写的分支名<br>
|
|
|
|
|
当这次`commit`要衍合到`dev_homepageFix`分支上时<br>
|
|
|
|
|
```shell
|
|
|
|
|
git rebase origin/dev_homepageFix
|
|
|
|
|
```
|
|
|
|
|
最后就可以`push`跟远程仓库同步了
|
|
|
|
|
####当我们到项目接近尾声的时候,需要将各自的分支都合并到`dev`分支上去<br>
|
|
|
|
|
先抓取最新仓库更新
|
|
|
|
|
```shell
|
|
|
|
|
git fetch
|
|
|
|
|
```
|
|
|
|
|
然后切到`dev`分支上
|
|
|
|
|
```shell
|
|
|
|
|
git checkout dev
|
|
|
|
|
```
|
|
|
|
|
再分别合并各个分支,这里以`dev_homepageFix`分支为例
|
|
|
|
|
```shell
|
|
|
|
|
git merge origin/dev_homepageFix
|
|
|
|
|
```
|
|
|
|
|
## 撤销操作
|
|
|
|
|
|
|
|
|
|
当我们想去整理我的提交,或者是把不该这次提交的修改提交了,我们可以对修改进行撤销,或者对提交进行撤销
|
|
|
|
|
##### 恢复暂存区的所有文件到工作区
|
|
|
|
|
```shell
|
|
|
|
|
git reset HEAD
|
|
|
|
|
```
|
|
|
|
|
##### 恢复暂存区的指定的某个文件到工作区
|
|
|
|
|
```shell
|
|
|
|
|
git reset HEAD README.md
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
我们做了一些修改,然后觉得自己做错了,不想提交
|
|
|
|
|
##### 可以重置暂存区、工作区,这样就能与上次提交保持一致,建议不要轻易这么做!
|
|
|
|
|
```shell
|
|
|
|
|
git reset --hard
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
当我们想重新整理提交的时候,比如说将上两次的提交整理到一次提交,我们可以重置到上两次的上次提交`commit`
|
|
|
|
|
##### 可以重置到指定的`commit`,并重置了暂存区,但工作区是不变的
|
|
|
|
|
```shell
|
|
|
|
|
git reset 2126dce
|
|
|
|
|
```
|
|
|
|
|
这种情况也会引发另外一个问题,当我们本地仓库与远程仓库一致的时候,然后我们重置,就需要用到`push`的`force`来进行强推,这是我们不想操作的,后续我会讲解一下强推的小建议!
|
|
|
|
|
|
|
|
|
|
##### 新建一个`commit`,用来撤销指定`commit`,后者所有变化都会被前者抵消,并应用到当前分支 <br>
|
|
|
|
|
我们也是不要轻易这么去做!
|
|
|
|
|
```shell
|
|
|
|
|
git revert 2126dce
|
|
|
|
|
```
|
|
|
|
|
##起别名
|
|
|
|
|
当我们有比较常用的命令行用的比较频繁,但是我们又觉得完整把它们敲出来费事
|
|
|
|
|
#####可以在 `~/.gitconfig` 文件里面进行设置别名,添加`alias`
|
|
|
|
|
```shell
|
|
|
|
|
[alias]
|
|
|
|
|
ft = fetch
|
|
|
|
|
ck = checkout
|
|
|
|
|
st = status
|
|
|
|
|
br = branch
|
|
|
|
|
rb = rebase
|
|
|
|
|
lg = log
|
|
|
|
|
```
|
|
|
|
|
然后试一下`git st`就管用了!
|
|
|
|
|
|
|
|
|
|
## 标签的相关操作
|
|
|
|
|
标签可以针对某一时间点的版本做标记,常用于版本发布
|
|
|
|
|
##### 列出标签
|
|
|
|
|
```shell
|
|
|
|
|
git tag
|
|
|
|
|
```
|
|
|
|
|
##### 创建附注标签
|
|
|
|
|
```shell
|
|
|
|
|
git tag -a v0.0.1-pro -m "pro发版"
|
|
|
|
|
```
|
|
|
|
|
##### 切换到标签
|
|
|
|
|
```shell
|
|
|
|
|
git checkout v0.0.1-pro
|
|
|
|
|
```
|
|
|
|
|
##### 查看标签的版本信息
|
|
|
|
|
```shell
|
|
|
|
|
git show v0.0.1-pro
|
|
|
|
|
```
|
|
|
|
|
##### 删除标签
|
|
|
|
|
```
|
|
|
|
|
git tag -d v0.0.1-pro
|
|
|
|
|
```
|
|
|
|
|
##### 给指定的commit打标签
|
|
|
|
|
```shell
|
|
|
|
|
git tag -a v0.0.1-pro 9fbc3dd
|
|
|
|
|
```
|
|
|
|
|
##### 将v0.0.1-pro标签提交到git服务器
|
|
|
|
|
```shell
|
|
|
|
|
git push origin v0.0.1-pro
|
|
|
|
|
```
|
|
|
|
|
##### 将本地所有标签一次性提交到git服务器
|
|
|
|
|
```shell
|
|
|
|
|
git push origin –tags
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 找回Git中丢失的Commit
|
|
|
|
|
|
|
|
|
|
在使用Git的过程中,有时候会因为一些误操作,比如reset、rebase、merge等,同时自己的Commmit记录也消失了。
|
|
|
|
|
不用慌,我们在Git上做的任何操作都只是在原来之前的操作上做修改,并且会被记录下来保存,也就是说无论你做了什么,对于Git来说都可以进行回滚操作。
|
|
|
|
|
|
|
|
|
|
##### 找回Commit
|
|
|
|
|
|
|
|
|
|
###### 这里以`git reset --hard`为例,如果我们这样操作,提交会消失。
|
|
|
|
|
|
|
|
|
|
###### 这时我们可以使用`reflog`查看一下
|
|
|
|
|
```shell
|
|
|
|
|
git reflog
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
###### 此时会出现这样
|
|
|
|
|
|
|
|
|
|
`99abc5a HEAD@{1}: commit: do something`
|
|
|
|
|
|
|
|
|
|
###### 我们要找回我们这个`commit`,只需要做如下操作:
|
|
|
|
|
```shell
|
|
|
|
|
git reset --hard 99abc5a
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
###### 针对不是`git reset --hard`误操作造成的丢失`commit`,我们可以使用`git cherry-pick 99abc5a`来找回代码,核心是我们需要找回丢失的`commit`
|