之前参照莫烦的Git教程整理过一遍Git总结,后来使用Git的时候发现还是有很多操作一知半解,所以再次梳理下Git使用
安装Git
windows上使用Git,可以从Git官网直接下载安装程序,选择默认安装即可
安装完成后,开始菜单-->Git-->Git Bash,打开后会弹出一个命令行窗口,就说明Git安装成功
- 安装完成之后需要进行name和email的配置,更好的记录每一次修改的修改人,--global这个参数表示这是个全局的配置,这台机器上的所有Git仓库都会使用这个配置
git config --global user.name "NAME"
git config --global user.email "[email protected]"
创建Git版本库
版本库可以简单理解为一个目录,这个目录下的所有文件都可以被Git管理起来,每个文件的修改删除,Git都能跟踪,以便查看修改记录或还原到某个时刻
- 要创建一个版本库,首先选择一个目录,也可创建一个空目录
mkdir learn_git
cd learn_git
pwd
/e/learn_git
- 通过git init 命令把这个目录变为git可管理的仓库
$ git init
Initialized empty Git repository in E:/git_learn/.git/
可以看到创建了一个空的git仓库,并且当前目录下多了一个.git目录这个目录是git用来跟踪管理版本库的
把文件添加到版本库
在当前目录下创建一个readme.txt文件,写入内容
vi readme.txt
Git is a version control system
Git is free software
- 用
git add
命令将文件添加到暂存区
$ git add readme.txt
没有任何输出,则表示添加暂存区成功
- 用
git commit
命令将文件从暂存区提交到版本库
$ git commit -m "wrote a readme file"
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
git commit
命令的-m
参数后面输入的是本次提交的说明
git commit
命令执行完成输出会提示1个文件被改动(新创建readme.txt),插入了2行(readme.txt文件有2行)
git commit
命令一次可以提交多个文件,可以多次使用git add
不同文件
git status
git status
命令可以查看当前仓库的状态(哪些有修改的,哪些修改文件在暂存区待提交)
修改readme.txt文件内容
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
输出信息显示
在master分支
没有提交的修改:
使用git add
将文件添加到暂存区
使用git checkout --
丢弃当前工作目录中的修改
被修改文件:readme.txt
还没有准备提交的修改
git diff
git diff
用来查看工作区和暂存区的不同
$ git diff
diff --git a/readme.txt b/readme.txt
index f7249b8..2fdf0c4 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system
+Git is a distributed version control system
Git is free software
可以看到两次的不同
-Git is a version control system
- 表示删除了这部分内容
+Git is a distributed version control system
+ 表示添加了这部分内容
-
git diff --cached file
用于暂存区和分支master不同的比较 -
git diff HEAD -- file
用于工作区和分支master不同的比较 - 使用
git add
添加修改到暂存区,再次使用git status
查看版本库状态
$ git add readme.txt
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: readme.txt
可以看到输出
在master分支上
将要被提交的修改:
使用git reset HEAD
取消已经进入暂存区的文件
修改文件:readme.txt
- 使用
git commit
命令提交修改到版本库,再使用git status
查看仓库状态
$ git commit -m "add distributed"
[master 015cd95] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
$ git status
On branch master
nothing to commit, working directory clean
可以看到输出当前没有需要提交的修改,工作目录是干净的
git log
使用git log 命令可以显示之前提交到版本库的记录,包括commit的id号、提交人、日期、提交说明
$ git log
commit 13cd2aa93fc97391a81fc28bf5319e86342ee2c1
Author: tyq
Date: Thu Jan 4 18:52:53 2018 +0800
append GPL
commit 015cd9545760909630f59e612020f59d52d8cb76
Author: tyq
Date: Thu Jan 4 18:46:38 2018 +0800
add distributed
commit f5302fbafba412e62b22f7bdae20437cd27a0eac
Author: tyq
Date: Thu Jan 4 17:52:44 2018 +0800
wrote a readme file
如果觉的输出的内容太多,想要简洁一些,可以使用命令git log --oneline
$ git log --oneline
13cd2aa append GPL
015cd95 add distributed
f5302fb wrote a readme file
git log --oneline
显示对应提交的id号和说明
回到过去
在GIt中用HEAD
表示当前版本也就是commit id为13cd2aa
,上个版本表示为HEAD^
,上上个版本表示为HEAD^^
,依次类推,也可以用commit id号表示对应的版本
想把‘append GPL’回退到‘add distributed’可以使用git reset
命令
$ git reset --hard HEAD^
HEAD is now at 015cd95 add distributed
查看readme.txt文件,果然回退到了'add distributed'版本
$ cat readme.txt
Git is a distributed version control system
Git is free software
Git版本的回退速度非常快,因为Git内部有个指向当前版本的指针,当回退版本的时候Git仅仅把HEAD从指向append GPL
改为指向add distributed
,顺便把工作区的文件更新了,所以让HEAD指向哪个版本号,就把当前版本定位在哪
使用git log --oneline
查看当前版本记录
$ git log --oneline
015cd95 add distributed
f5302fb wrote a readme file
可以看到只显示了2个版本,现在想要回到append GPL
的版本时,可以有2种方式
第一种, 往上翻找到append GPL
的commit id号,使用命令git reset --hard id号
回到append GPL
版本
如果之前的窗口关掉了commit id号往上翻找不到了可以使用下面的方法
第二种,使用git reflog
,这个命令用来记录你的每一次执行的命令
$ git reflog
015cd95 HEAD@{0}: reset: moving to HEAD^
13cd2aa HEAD@{1}: commit: append GPL
015cd95 HEAD@{2}: commit: add distributed
f5302fb HEAD@{3}: commit (initial): wrote a readme file
可以看到append GPL
的commit id号为13cd2aa
,使用git reset --hard 13cd2aa
回到append GPL
版本
工作区和暂存区
- 工作区
工作区就是电脑里面能看到的目录,比如之前创建的learn_git
文件夹就是一个工作区 - 版本库
工作区中有一个隐藏的.git目录,这个不算是工作区,而是Git的版本库
Git版本库中存了很多东西,其中最重要的是称为stage
的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针HEAD
把一个文件向版本库中添加时,是分两步执行的
1.使用git add
命令把文件的修改添加进暂存区
2.使用git commit
将暂存区的所有内容提交到当前分支
Git跟踪管理的是修改
每次修改如果不add
到暂存区,就不会加入到commit
中
撤销修改
- 文件未添加到暂存区
git checkout --file
命令用与将文件在工作区的修改撤销掉 - 文件添加到暂存区
git reset HEAD file
命令用于将暂存区的文件修改回退到工作区,再使用git checkout --file
命令即可将工作区的修改撤销掉。这里的HEAD
是指当前的版本库,还可以使用git reset 版本号 file
回退到某个特定的文件 - 文件已提交至版本库,未推送至远程版本库
参照之前的回退版本操作,使用git reset --hard id号
命令
删除文件
- 删除未添加到暂存区的文件
rm file
直接删除即可
$ git status
On branch master
Untracked files:
(use "git add ..." to include in what will be committed)
test.txt
nothing added to commit but untracked files present (use "git add" to track)
$ rm test.txt
$ git status
On branch master
nothing to commit, working directory clean
可以看到test.txt已成功删除
- 删除已添加到暂存区的文件,未提交到版本库
分两步进行
1.rm file
删除工作区文件
2.git add file
将修改添加到暂存区
这样就成功删除了文件 - 删除已经提交到版本库的文件
1.rm file
首先删除工作区的文件
2.git add file
将工作区的修改添加到暂存区
3.git commit -m "remove file"
将修改提交至版本库
上面的1、2两步可以直接使用git rm file
这一条命令代替,git rm
表示将工作区和暂存区的文件都删除掉
添加远程库
当本地已经有了一个git仓库,想要创建一个远程库时,可以先关联,然后进行推送
- 要关联一个远程库,使用下面的命令
git remote add origin git@server-name:path/repo-name.git
添加后远程库的名字就叫origin
这是Git的默认叫法,也可以改成别的 - 关联后使用命令
git push -u origin master
第一次推送master分支的所有内容,加了-u
参数Git不但会把本地的master分支内容推送到远程新的master分支还会把本地的master分支和远程的master分支关联起来,在以后推送或者拉取时就可以简化命令
此后就可以每次使用git push origin master
推送最新的修改至远程库 - 使用
git remote -v
命令可以查看本地关联的远程仓库origin
的地址
如果从零开始,先创建远程库,再从远程库进行克隆
- 创建远程库,在github页面进行创建
- 使用命令
git clone
克隆一个本地库
git clone git@server-name:path/repo-name.git
Git支持hhtps、ssh等多种协议
创建与合并分支
Git中的HEAD
实际上执行的是当前的分支,每个分支中都有一个指针指向当前的提交
- 首先创建
dev
分支,然后切换到dev
分支
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
加上-b
参数表示创建并切换,相当与以下2条命令
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后用git branch
命令查看当前分支
$ git branch
* dev
master
git branch
命令会列出所有的分支,当前的分支会用一个*
标出
现在可以在dev分支上进行正常的修改提交
$ vi readme.txt
$ git add readme.txt
$ git commit -m "branch test"
[dev 6f978d0] branch test
1 file changed, 1 insertion(+)
现在dev
分支上的工作完成,我们就可以切换回master
分支
$ git checkout master
Switched to branch 'master'
切换回master
分支后会看到刚才提交的修改不见了,因为刚才的修改在dev
分支上,而master分支此刻的提交点并没有变
- 现在把
dev
上的工作成果合并到master
上
$ git merge dev
Updating eb42341..6f978d0
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge
命令用于合并指定分支到当前分支。合并后查看readme.txt文件可以看到和dev
分支上最新提交的是一样的
上面的输出中有一行Fast-forward
,表示这是合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所有合并速度非常快
- 合并后就可以删除
dev
分支了
$ git branch -d dev
Deleted branch dev (was 6f978d0).
$ git branch
* master
解决冲突
准备新的feature1分支进行开发
$ git checkout -b feature1
Switched to a new branch 'feature1'
修改readme.txt文件,并提交
$ vi readme.txt
$ git add readme.txt
$ git commit -m "AND simple"
[feature1 029a3b2] AND simple
1 file changed, 1 insertion(+), 1 deletion(-)
切换到master
分支,修改readme.txt并提交
$ git checkout master
Switched to branch 'master'
$ vi readme.txt
$ git add readme.txt
$ git commit -m "& simple"
[master 9243e69] & simple
1 file changed, 1 insertion(+), 1 deletion(-)
- 进行合并
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
从输出可以看到Automatic merge failed; fix conflicts and then commit the result.
合并失败了,Git让先解决冲突然后在提交结果
使用git status
命令也可以告诉我们冲突的文件
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
直接vi
查看readme.txt
$ vi readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
可以看到Git用<<<<<< ====== >>>>>>标记出了不同分支的内容
<<<<<<< HEAD
Creating a new branch is quick & simple.
表示当前master
分支的内容
Creating a new branch is quick AND simple.
>>>>>>> feature1
表示feature1
分支的内容
在此模式下修改这个文件为想要的内容,然后保存再提交
$ git add readme.txt
$ git commit -m "conflict fixed"
[master 7ff0a70] conflict fixed
可以看到输出提示冲突已解决,查看readme.txt内容为刚刚保存的内容
用带参数的git log
命令可以查看当前的分支合并情况
$ git log --graph --pretty=oneline --abbrev-commit
* 7ff0a70 conflict fixed
|\
| * 029a3b2 AND simple
* | 9243e69 & simple
|/
* 6f978d0 branch test
* eb42341 remove test.txt
* 28abff3 add test.txt
* 665e753 remove test.txt
* 232dc37 add text.txt
最后删除分支
$ git branch -d feature1
Deleted branch feature1 (was 75a857c).
- 使用
git branch -D
强行删除一个未合并的分支
$ git branch -d dev #dev分支未合并,所以删除失败
error: The branch 'dev' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev'.
$ git branch -D dev # 强行删除
Deleted branch dev (was e32273c).
分支管理策略
通常分支合并时,如果可能,Git会用Fast forword
模式,在这种模式下删除分支,会丢掉分支信息
$ git log --graph --pretty=oneline --abbrev-commit
* 6106360 test fast forword
* 7ff0a70 conflict fixed
像上面的test fast forword
不会保留dev分支信息
git merge
命令加上--no-ff
参数会禁用Fast forword
模式,Git会在merge时生成一个新的commit,这样从分支历史上就可以看出分支信息
- 创建一个新的
dev
分支,修改readme.txt,提交修改内容,切换至master
分支
$ git checkout -b dev
Switched to a new branch 'dev'
$ vi readme.txt
$ git add readme.txt
$ git commit -m "test --no--ff"
[dev 8de91d1] test --no--ff
1 file changed, 1 insertion(+), 1 deletion(-)
$ git checkout master
Switched to branch 'master'
使用git merge --no-ff
命令合并
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
这里的-m
参数相当与commit 时候的说明。因为会生成一个新的commit所以使用-m
参数添加提交说明
使用git log
查看提交历史
$ git log --graph --pretty=oneline --abbrev-commit
* 4286431 merge with no-ff
|\
| * 8de91d1 test --no--ff
|/
* 6106360 test fast forword
* 7ff0a70 conflict fixed
可以看到这里和上一次merge的test fast forword
不同,显示了分支上test--no-ff
的提交,并创建了一个新的commit记录
Fast forword
模式相当与直接将master
提交指向了dev
提交,将HEAD
指向master
Git stash
正在dev
分支上工作,还没有提交,突然需要解决线上bug,这个时候就需要将dev
分支上的内容储藏起来,等以后恢复现场再使用,可以使用git stash
命令
$ vi readme.txt
$ git status
On branch dev
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
可以看到当前dev
分支正在工作
$ git stash
Saved working directory and index state WIP on dev: 8de91d1 test --no--ff
HEAD is now at 8de91d1 test --no--ff
$ git status
On branch dev
nothing to commit, working directory clean
使用git stash
命令将当前工作储藏起来,可以看到现在当前dev
分支是干净的
使用git stash list
命令可以查看储藏的列表
$ git stash list
stash@{0}: WIP on dev: 8de91d1 test --no--ff
可以看到工作现场还在GIt把它存储在某个地方了
想要恢复有2中方法
1.使用git stash apply
恢复,但是恢复后stash内容不会删除,需要使用git stash drop
来删除
$ git stash apply
On branch dev
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git stash list
stash@{0}: WIP on dev: 8de91d1 test --no--ff
$ git stash drop
Dropped refs/stash@{0} (e83c20f2d39c1b48e25108923f4f7013e3855ed4)
$ git stash list
2.使用git stash pop
恢复的同时把stash
的内容也删了
$ git stash pop
On branch dev
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (f94abd78b7ae06ada2581a2b92e63bc74c1fd164)
可以多次stash
,然后使用git stash apply stash@{0}
,恢复指定的stash
- 这里说明下为什么要使用
git stash
,当在dev
分支上有没有提交的内容,直接切换到master
时,会发现dev
上没有提交的内容,在master
中也会存在dev
分支上的修改,所以这时候就需要用stash
了
git remote
要查看远程库的信息,用git remote
$ git remote
origin
可以看到远程仓库的默认名称是origin
用git remote -v
可以查看更详细的信息
$ git remote -v
origin https://github.com/tangxq/test.git (fetch)
origin https://github.com/tangxq/test.git (push)
上面显示了可以抓取和推送的远程地址,如果没有推送权限就看不到push
的地址
推送分支
推送分支,就是把该分支上所有本地提交推送到远程库,推送时,要指定本地分支,这样Git就会把该分支推送到远程库对应的远程分支上
$ git push origin master #推送master分支至远程库的master分支上
$ git push origin dev # 推送dev分支到远程库dev分支
抓取分支
当clone一个项目时,默认只会clone下来master
分支,例如想要抓取远程库的dev
分支,就必须创建远程的origin
的dev
分支到本地,可以使用如下命令
$ git checkout -b dev origin/dev
Branch dev set up to track remote branch dev from origin.
Switched to a new branch 'dev'
这样本地创建的dev
分支就与远程库的dev
分支相对应了
多人协作
- 当在
dev
分支上工作完成准备推送到远程dev
分支时,可以会出现下面的情况
$ git push origin dev
To https://github.com/tangxq/test.git
! [rejected] dev -> dev (fetch first)
error: failed to push some refs to 'https://github.com/tangxq/test.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
推送失败,从提示信息可以看到是因为本次提交的推送和远程库中的内容有冲突(原因是别的小伙伴修改了同一个文件并且已经提交至远程dev
分支),GIt已经提示我们先用git pull 把最新的提交抓取下来,在本地合并冲突提交,再推送
- 第一步,先用
git pull
把最新的提交抓取下来
$ git pull origin dev
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/tangxq/test
* branch dev -> FETCH_HEAD
ee45e18..ae94d9c dev -> origin/dev
Auto-merging test1.txt
CONFLICT (content): Merge conflict in test1.txt
Automatic merge failed; fix conflicts and then commit the result.
这里也可以使用另一种方法,先使用git branch --set-upstream dev origin/dev
命令将本地的dev
分支与远程dev
分支关联,然后再使用git pull
命令
- 第二步,合并冲突,并提交至版本库
1.首先使用git status
查看发生冲突的文件
On branch dev
Your branch and 'origin/dev' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: test1.txt
Untracked files:
(use "git add ..." to include in what will be committed)
logs/
test.txt
no changes added to commit (use "git add" and/or "git commit -a")
2.使用vi
命令编辑解决冲突
$ vi test1.txt
3.提交修改
$ git add test1.txt
$ git commit -m "merge & fixed test1.txt"
[dev 2cc8eb9] merge & fixed test1.txt
- 第三步,在用
git push
命令推送至远程版本库
$ git push origin dev
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 410 bytes | 0 bytes/s, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/tangxq/test.git
ae94d9c..2cc8eb9 dev -> dev
标签管理
发布一个版本时,通常会先在版本库中打一个标签(tag),这样就确定了打标签时刻的版本,tag相当与是当前commit id的一个指针,是全局的,和分支没有关系
使用git tag name
命令在git中打标签
$ git branch
* dev
master
$ git tag v1.0
可以使用git tag
命令查看所有标签
$ git tag
v1.0
默认标签都是打在最新的commit id上,如果要在指定的commit id上打标签,使用git tag name id号
即可
使用git log
命令列出所有的commit id
2cc8eb9 merge & fixed test1.txt
f00abb4 add hehe
ae94d9c edit test1.txt
ee45e18 Merge tag 'v1.0' of https://github.com/xxx/test into dev
454eb54 write dev dev1
64f1c6c add write dev1
e3fef54 add write dev
606b1dc add test1
比如要对add hehe
这个commit打tag,使用如下命令即可
$ git tag v0.9 f00abb
使用git tag命令查看tag列表
$ git tag
v0.9
v1.0
标签不是按照时间顺序列出的,而是按照字母顺序列出。
可以使用git show tagname
查看tag详细信息
$ git show v0.9
commit f00abb43d5a68dae01b73978657b964353baabb1
Author: tyq
Date: Sat Jan 6 11:22:58 2018 +0800
add hehe
diff --git a/test1.txt b/test1.txt
index 5ad28e2..844e587 100644
--- a/test1.txt
+++ b/test1.txt
@@ -1 +1,2 @@
-haha
+haha.
+hehe
还可以创建带有说明的标签,-a
指定标签名-m
指定说明文字
$ git tag -a v0.8 -m "version 0.8 released" ee45e
使用git show tagname
命令可以看到文字说明
$ git show v0.8
tag v0.8
Tagger: tyq
Date: Sat Jan 6 14:58:43 2018 +0800
version 0.8 released
commit ee45e18527440d7ba9e72a2ad8240cb80306a4a9
Merge: 454eb54 6229764
Author: tyq
Date: Thu Jun 29 11:24:57 2017 +0800
Merge tag 'v1.0' of https://github.com/xxx/test into dev
操作标签
如果标签打错了,也可以删除
$ git tag -d v0.8
Deleted tag 'v0.8' (was 4d86fe9)
如果想要推送某个标签到远程可以使用git push origin tagname
$ git push origin v0.9
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/xxx/test.git
* [new tag] v0.9 -> v0.9
或者一次性推送全部尚未推送到远程的标签
$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 554 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://github.com/xxx/test.git
* [new tag] v0.2 -> v0.2
* [new tag] v0.9 -> v0.9
如果想要拉取远程库中的tag,使用git pull
$ git pull
From https://github.com/tangxq/test
* [new tag] v1.0 -> v1.0
Already up-to-date.
如果tag已经推送到远程仓库删除,需要2步
1.首先删除本地的tag
$ git tag -d v0.8
Deleted tag 'v0.8' (was 4d86fe9)
2.删除远程仓库中的tag
$ git push origin :refs/tags/v.08
To https://github.com/tangxq/test.git
- [deleted] v0.8
- git 常用命令
# git 拉取远程指定的分支并关联
git checkout -b 本地分支名 origin/远程分支名
# 更改关联本地分支和远程的分支
git branch --set-upstream-to origin/远程分支名 本地分支名
# 提交当前分支的内容到远程对应的分支
git push origin HEAD: 远程分支名
# 强制提交当前分支的内容到远程对应的分支(慎用)
git push origin HEAD: 远程分支名 --force
# 撤销某次操作,此次操作的之前和之后的commit和history都会保留,并且把这次撤销
git revert HEAD #撤销前一次commit
git revert HEAD^ #撤销前前一次commit
git revert commitId #依据commitId撤销commit
# git revert和git reset区别:git revert增加head指针,git reset 修改指针位置到某次commit
# 指定git账号clone某个仓库地址
git clone http://[email protected]/xx-xxx/xxx.git
#撤销工作区所有文件修改
git checkout -f HEAD
#pull 代码失败解决方法,将改的添加到暂存去,然后git stash暂存,此时为一个干净的空间,然后git pull 拉取
git add *
git stash
git pull