获取Git仓库

通常两种方式获取git仓库

  1. 将尚未进行版本控制的本地目录转换为Git仓库
  2. 从其它服务器克隆一个已存在的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
2
3
4
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

在项目下创建一个新的README文件。如果之前并不存在这个文件,使用 git status命令,将看到一个新的未跟踪文件:

1
2
3
4
5
6
7
8
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)
  README
nothing added to commit but untracked files present (use "git add" to
track)

状态简览 git status -s

git status命令的输出十分详细,但其用语有些繁琐。Git有一个选项可以帮你缩短状态命令的输出,这样可以以简洁的方式查看更改。如果你使用git status -s命令或git status —short命令,你将得到一种格式更为紧凑的输出。

1
2
3
4
5
6
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt

说明:

  1. 新添加的未跟踪文件前面有 ?? 标记。如LICENSE.txt处于未跟踪状态
  2. 新添加到暂存区中的文件前面有 A 标记。lib/git.rb 为新添加到暂存区中的文件
  3. 修改过的文件前面有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的文件,列出要忽略的文件的模式。

提交更新 git commit

命令:git commit(每次使用先用git status命令查看所需文件是否已经暂存)
编辑器会显示类似下面的文本信息(本例选用 Vim 的屏显方式展示):

1
2
3
4
5
6
7
8
9
10
11
12
13
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
# new file: README
# modified: CONTRIBUTING.md
#
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C

可以看到,默认的提交消息包含最后一次运行 git status 的输出,放在注释行里,另外开头还有一个空行,供你输入提交说明。 你完全可以去掉这些注释行,不过留着也没关系,多少能帮你回想起这次更新的内容有哪些。

如果想要直接输入提交信息:git commit -m xxx
这样就不会出现编辑窗口,直接提交更新

查看提交历史 git log

命令:git log(参数很多另行查找)

  1. git log --oneline 简略输出提交历史

 撤销操作

git commit $\text{-}\text{-}$amend

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 —amend 选项的提交命令来重新提交:

1
2
3
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

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 , 当前文件编辑的状态也是在 C

1
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
2
3
4
5
6
7
8
9
10
   (F)
A-B-C
^
master
# 输入 git reset --soft
(F)
A-B-C
^
master
# 此时文件状态与分支状态都指向上一个提交,c还在只是没显示,而且文件已经add

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
2
3
4
5
6
7
8
9
10
$ git clone https://github.com/xxx/xxx
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

也可以指定-v选项,会显示需要读写远程仓库使用的git保存的简写与其对应的URL。

1
2
3
$ git remote -v
radar_system https://gitee.com/ccchenji/radar_system (fetch)
radar_system https://gitee.com/ccchenji/radar_system (push)

添加远程仓库

命令: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命令默认就是查看工作区和暂存区之间文件的差异

  1. git diff:查看工作区和暂存区之间所有的文件差异
  2. git diff -- 文件名:查看具体某个文件在工作区和暂存区之间的差异
  3. git diff -- 文件名1 文件名2 文件名3:查看多文件在工作区和暂存区之间的差异

注意:$\text{-}\text{-}$和文件名之间有一个空格

查看工作区和版本库之间文件的差异

  1. git diff HEAD:查看工作区与最新版本库之间的所有的文件差异
  2. git diff 具体某个版本:查看工作区与具体某个提交版本之间的所有文件的文件差异
  3. git diff HEAD -- 文件名:查看工作区和最新版本库之间的指定文件名的文件差异
  4. git diff HEAD -- 文件名1 文件名2:查看工作区与最新版本库之间的指定文件名的多个文件差异。

查看暂存区与版本库之间文件的差异

  1. git diff --cached :查看暂存区和上一次提交的最新版本(HEAD)之间的所有文件差异。
  2. git diff --cached 版本号:查看暂存区和指定版本之间的所有文件差异。
  3. git diff --cached -- 文件名1 文件名2:产看暂存区和HEAD之间的指定文件差异。
  4. git diff --cached 版本号 -- 文件名1 文件名2:查看暂存区和指定版本之间的指定文件差异

查看不同版本库之间文件的差异

  1. git diff 版本号1 版本号2:查看两个版本之间的差异
  2. git diff 版本号1 版本号2 -- 文件名1 文件名2:查看两个版本之间的指定文件之间的差异
  3. git diff 版本号1 版本号2 --stat:产看两个版本之间的改动的文件列表
  4. git diff 版本号1 版本号2 src:查看两个版本之间的文件夹src之间的差异