git学习
获取Git仓库
通常两种方式获取git仓库
- 将尚未进行版本控制的本地目录转换为Git仓库
- 从其它服务器克隆一个已存在的Git仓库。
初始化本地Git仓库 git init
进入进行版本控制的目录:
1 | cd /home/user/my_project |
之后执行:git init
1 | git init |
克隆现有的仓库 git clone
克隆仓库的命令是 git clone <url>
1 | git clone https://github.com/libgit2/libgit2 |
如果想在克隆远程仓库的时候,自定义本地仓库的名字,可以通过额外的参数指定新的目录名:
1 | git clone https://github.com/libgit2/libgit2 mylibgit |
注意:默认clone的是master仓库,如果想clone别的分支:git clone -b 远程分支名 远程仓库地址
检查当前文件状态 git status
可以用 git status
命令查看哪些文件处于什么状态。 如果在克隆仓库后立即使用此命令,会看到类似这样的输出:
1 | git status |
在项目下创建一个新的README文件。如果之前并不存在这个文件,使用 git status
命令,将看到一个新的未跟踪文件:
1 | git status |
状态简览 git status -s
git status
命令的输出十分详细,但其用语有些繁琐。Git有一个选项可以帮你缩短状态命令的输出,这样可以以简洁的方式查看更改。如果你使用git status -s命令或git status —short命令,你将得到一种格式更为紧凑的输出。
1 | git status -s |
说明:
- 新添加的未跟踪文件前面有 ?? 标记。如LICENSE.txt处于未跟踪状态
- 新添加到暂存区中的文件前面有 A 标记。lib/git.rb 为新添加到暂存区中的文件
- 修改过的文件前面有M标记。输出中有两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。上面的状态报告显示:README文件在工作区已修改但尚未暂存,而 lib/simplegit.rb 文件已修改且已暂存。Rakefile 文件已修,暂存后又作了修改,因此该文件的修改中既有已暂存的部分,又有未暂存的部分。
跟踪新文件 git add
使用命令 git add
开始跟踪一个文件。所以,要跟踪README文件,运行:
1 | git add README |
想要跟踪所有的未跟踪的文件:git add .
1
git add .
移除文件 git rm
命令:git rm
选项: -f 强制删除文件,并取消跟踪
选项: —cached 取消跟踪,但不删除文件
例子:git rm -f xxx
git rm --cached xxx
文件重命名 git mv
命令:git mv file_from file_to
其实,运行git mv就相当于运行了下面三条命令:1
2
3 mv README.md README
git rm README.md
git add README
忽略文件 .gitignore
一般我们总会有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以创建一个名为.gitignore的文件,列出要忽略的文件的模式。
- GitHub有一个十分详细的针对数十种项目及语言的.gitignore文件列表,可以在 https://github.com/github/gitignore 找到它。
提交更新 git commit
命令:git commit
(每次使用先用git status命令查看所需文件是否已经暂存)
编辑器会显示类似下面的文本信息(本例选用 Vim 的屏显方式展示):
1 | Please enter the commit message for your changes. Lines starting |
可以看到,默认的提交消息包含最后一次运行 git status 的输出,放在注释行里,另外开头还有一个空行,供你输入提交说明。 你完全可以去掉这些注释行,不过留着也没关系,多少能帮你回想起这次更新的内容有哪些。
如果想要直接输入提交信息:git commit -m xxx
这样就不会出现编辑窗口,直接提交更新
查看提交历史 git log
命令:git log
(参数很多另行查找)
git log --oneline
简略输出提交历史
撤销操作
git commit $\text{-}\text{-}$amend
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 —amend 选项的提交命令来重新提交:
1 | git commit -m 'initial commit' |
git revert
git revert 撤销某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交。
- git revert HEAD 撤销前一次 commit
- git revert HEAD^ 撤销前前一次 commit
- git revert commit (例如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销会作为一次提交进行保存。
git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容
git reset
我们在使用git进行版本管理的时候,如果遇到需要回退代码的情况,一般会用 git reset 命令,不过这个命令还有几个参数:
git reset $\text{-}\text{-}$hard
这个命令非常危险 ,是git中少有的几个会丢失信息的操作。它会把回退点之前的所有信息都删掉,一个不留,干干净净。
举个例子:现在我把 A 文件修改了两次,到了 C 状态 ,并且已提交。那么我的分支指针是指向 C , 当前文件编辑的状态也是在 C1
2
3
4
5
6
7
8
9 (F)
A-B-C
^
master
输入 git reset --hard
(F)
A-B
^
master
git reset $\text{-}\text{-}$soft
1 | (F) |
git reset $\text{-}\text{-}$mixed(默认状态)
同git reset —soft 只不过文件未add
分支的新建与合并
分支的新建
新建分支:git branch branch_name
转换到新分支: git checkout branch_name
上面两条命令可以合并为: git checkout -b branch_name
分支的删除
命令:git branch -d xxx
1
git branch -d branch_name
分支的合并
命令:git merge xxx
1
2
3
4
5
6 git checkout master
Switched to branch 'master'
git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
分之合并后将原来的分支删除git branch -d xxx
查看本地仓库分支
命令:git branch
查看本地和远程仓库的所有分支
命令:git branch -a
查看远程仓库的分支
命令:git branch -r
远程仓库的使用 git remote
查看远程仓库
如果想查看你已经配置的远程仓库服务器,可以运行 git remote
命令。 它会列出你指定的每一个远程服务器的简写。 如果你已经克隆了自己的仓库,那么至少应该能看到 origin ——这是 Git 给你克隆的仓库服务器的默认名字:
1 | git clone https://github.com/xxx/xxx |
也可以指定-v选项,会显示需要读写远程仓库使用的git保存的简写与其对应的URL。
1 | git remote -v |
添加远程仓库
命令:git remote add <shortname> <url>
作用:添加一个新的远程Git仓库,同时指定一个方便使用的简写
从远程仓库抓去与拉取
命令:git fetch <remote>
这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成以后,你讲会拥有哪个远程仓库中所有分支的引用,可以随时合并或查看。
如果你使用clone
命令克隆了一个仓库,命令会自动讲其添加为远程仓库并默认以”orgin”为简写。所以,git fetch origin
会抓去克隆(或上一次抓取后)新推送的所有工作。必须注意git fetch命令只会将数据下载到你的本地仓库—它并不会自动合并或修改你当前的工作。当准备好时你必须手动讲其合并入你的工作。
推送到远程仓库
命令:git push origin master
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先抓取他们的工作并将其合并进你的工作后才能推送。
强制推送命令:git push -f origin master
请谨慎使用该命令!!!!
远程仓库的重命名与移除
重名命名:git remote rename pb paul
作用:将pb重命名为paul
移除:git remote remove paul
作用:移除paul
比较文件差异git diff
查看工作区和暂存区之间文件差异
命令:git diff
命令默认就是查看工作区和暂存区之间文件的差异
git diff
:查看工作区和暂存区之间所有的文件差异git diff -- 文件名
:查看具体某个文件在工作区和暂存区之间的差异git diff -- 文件名1
文件名2 文件名3:查看多文件在工作区和暂存区之间的差异
注意:$\text{-}\text{-}$和文件名之间有一个空格
查看工作区和版本库之间文件的差异
git diff HEAD
:查看工作区与最新版本库之间的所有的文件差异git diff 具体某个版本
:查看工作区与具体某个提交版本之间的所有文件的文件差异git diff HEAD -- 文件名
:查看工作区和最新版本库之间的指定文件名的文件差异git diff HEAD -- 文件名1 文件名2
:查看工作区与最新版本库之间的指定文件名的多个文件差异。
查看暂存区与版本库之间文件的差异
git diff --cached
:查看暂存区和上一次提交的最新版本(HEAD)之间的所有文件差异。git diff --cached 版本号
:查看暂存区和指定版本之间的所有文件差异。git diff --cached -- 文件名1 文件名2
:产看暂存区和HEAD之间的指定文件差异。git diff --cached 版本号 -- 文件名1 文件名2
:查看暂存区和指定版本之间的指定文件差异
查看不同版本库之间文件的差异
git diff 版本号1 版本号2
:查看两个版本之间的差异git diff 版本号1 版本号2 -- 文件名1 文件名2
:查看两个版本之间的指定文件之间的差异git diff 版本号1 版本号2 --stat
:产看两个版本之间的改动的文件列表git diff 版本号1 版本号2 src
:查看两个版本之间的文件夹src之间的差异