来自Git的4个阶段的撤销更改、Git远程操作详解等博客的学习总结(PS:备份)。
Git的基本概念
在创建Git仓库的时候,工作区会有一个隐藏目录.git(Git的版本库),Git会自动创建一个master分支,以及一个指向master分支的指针HEAD
。
如上图所示,Git的本地管理主要分为三个区,第一个工作区,第二个暂存区(statge/index),第三个本地仓库。
1.工作区中文件的增删改,通过git add <file>
将改动文件添加到暂存区
2.通过git commit -m "descriptions"
将暂存区的多次改动提交到本地仓库
3.通过git push
将本地仓库推送到远程仓库。
Git分支管理
每个人在各自的分支上开发,互相不影响,最后由管理员或者自己来合并分支,处理冲突,测试上线。
以下流程包括查看分支、新建并切换到dev分支、在dev分支修改文件后合并到master分支,最后删除dev分支的过程。
下面的例子演示了从github clone一个test
仓库到本地,并创建新分支dev,在新分支dev上修改文件,合并到主分支master,最后删除dev分支。(注意: 执行git clone
命令是将远程仓库更新到本地仓库区,而不是本地工作区!)
查看分支
* master
表示当前分支为master。
新建并切换分支
|
|
使用git branch
查看分支,共有两个分支,当前分支为dev
。
接下来在test文件夹下新建read.txt,并执行git add readme.txt
和git commit -m "添加文件测试"
将变化从工作区提交到本地仓库区:
|
|
合并分支
首先从dev分支切换回master分支
再执行合并dev分支
最后删除dev分支
|
|
Git常用指令
git --help
中常见的git操作指令如下:
git branch
默认查看本地分支git branch -a
查看所有的分支git branch -r
查看远程分支
|
|
Git远程操作
git clone
git clone <版本库的网址> <本地目录名>
从远程主机克隆一个版本库,若不带第二个参数,会在本地主机生成一个与远程主机版本库同名的版本库。eg, 克隆github仓库test到本机,并命名为testLocal:
git remote
Git要求每个远程主机都必须指定一个主机名。git remote
命令就用于管理主机名。
不带参数时,
git remote
命令查看所有远程主机名:123Shirley@DESKTOP-G6LSDJO MINGW64 ~/Desktop/testLocal (master)$ git remoteorigin带
-v
参数,可以查看所有远程主机名对应的网址:1234Shirley@DESKTOP-G6LSDJO MINGW64 ~/Desktop/testLocal (master)$ git remote -vorigin https://github.com/shirley5li/test (fetch)origin https://github.com/shirley5li/test (push)
注意: 克隆版本库的时候,所使用的远程主机名自动被Git命名为origin,如果想用其他的主机名,需要用git clone
命令的-o
参数指定。例如,克隆时指定远程主机名为Test,可以使用 git clone -o Test https://github.com/shirley5li/test
。
git remote show <主机名>
,查看主机详细信息。git remote add <主机名> <网址>
,用于添加远程主机。git remote rm <主机名>
,删除远程主机。git remote rename <原主机名> <新主机名>
,更改远程主机的名字。
git fetch
- 用法:
git fetch <远程主机名> <分支名>
用于将远程主机版本库的更新取回到本地,但不会对本地的开发代码产生影响,当不指定<分支名>
时,默认取回所有分支的更新。(若要作用到本地代码,还需要配合使用git merge
)
注意: 所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取。比如origin
主机的master
,就要用origin/master
读取。查看远程分支(-a
表示查看所有分支):
取回远程主机的更新以后,可以在它的基础上,使用
git checkout
命令创建一个新的分支:1git checkout -b newBranch origin/master使用
git merge
或git rebase
命令,在本地分支上合并远程分支。以下表示在当前分支上,合并origin/master
:12$ git merge origin/master$ git rebase origin/master
git pull
- 用法:
git pull <远程主机名> <远程分支名>:<本地分支名>
用于取回远程主机某个分支的更新,再与本地的指定分支合并,如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
例如,取回远程origin/next
分支,再与当前分支合并,等同于先git fetch
,再git merge
:
- 若当前分支与远程分支存在tracking关系,
git pull
可以省略远程分支名。
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone
的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,即本地的master
分支自动tracking origin/master
分支。
Git也允许手动建立追踪关系,如下指定本地master
分支tracking origin/next
分支:
此时,git pull
可以省略远程分支名:
- 若当前分支只有一个tracking分支,还可以省略远程主机名:
|
|
上面命令表示,当前分支自动与唯一一个tracking分支进行合并。
采用
--rebase
模式:git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
【git merge 和 git rebase 小结】加上参数
-p
如果远程主机删除了某个分支,默认情况下,git pull
不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull
不知不觉删除了本地分支,通过添加参数-p
可以在本地删除远程已经删除的分支。
git push
- 用法:
git push <远程主机名> <本地分支>:<远程分支>
用于将本地分支的更新,推送到远程主机。
- 省略远程分支名
如果省略远程分支名,则表示将本地分支推送到与之存在tracking关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建,例如git push origin master
表示将本地的master
分支推送到origin
主机的master
分支,如果后者不存在,则会被新建。
- 省略本地分支名
表示删除指定的远程分支,等同于推送一个空的本地分支到远程分支,以下命令表示删除origin
主机的master
分支:
- 省略本地分支和远程分支
如果当前分支与远程分支之间存在tracking系,则本地分支和远程分支都可以省略: git push origin
。
- 省略远程主机名
如果当前分支只有一个追踪分支,那么主机名也可以省略: git push
。
Git的4个阶段的撤销更改
该部分内容假设只有一个主分支master。
4个区
- 工作区(Working Area)
- 暂存区(Stage)
- 本地仓库(Local Repository)
- 远程仓库(Remote Repository)
5种状态
以上4个区,进入每一个区成功之后会产生一个状态,再加上最初始的一个状态,一共是5种状态。
- 未修改(Origin)
- 已修改(Modified)
- 已暂存(Staged)
- 已提交(Committed)
- 已推送(Pushed)
检查修改
已修改,未暂存
|
|
git diff
这个命令只检查工作区和暂存区之间的差异。
已暂存,未提交
|
|
git diff --cached
用于检查暂存区到本地仓库之间的差异。
已提交,未推送
|
|
这里,master
表示的本地仓库分支,而origin/master
表示远程仓库分支。以上命令用于检查本地仓库与远程仓库之间的差异。
撤销修改
已修改,未暂存
|
|
或者
做完修改之后,如果你想向前走一步,让修改进入暂存区,就执行git add .
,如果你想向后退一步,撤销刚才的修改,就执行git checkout .
。
已暂存,未提交
|
|
或者
git reset
只是把修改退回到了git add .
之前的状态,即文件本身还处于已修改未暂存状态,你如果想退回未修改状态,还需要执行git checkout .
。
已提交,未推送
|
|
此刻的状态已经污染了本地仓库,需要从远程仓库把代码取回来。
已推送
|
|
此刻已经污染了远程仓库,需要先恢复本地仓库,再强制push到远程仓库。