初始化仓库

通常有两种获取 Git 项目仓库的方式:

  1. 将尚未进行版本控制的本地目录转换为 Git 仓库;

  2. 从其它服务器 克隆 一个已存在的 Git 仓库。

两种方式都会在你的本地机器上得到一个工作就绪的 Git 仓库。

在已存在目录中初始化仓库

如果你有一个尚未进行版本控制的项目目录,想要用 Git 来控制它,那么首先需要进入该项目目录中之后执行:

1
$ git init

该命令会生成一个.git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件。

但这个时候只是仅仅做了初始化操作,你项目里的文件还没有被跟踪,这个时候就需要通过git add 命令将文件提交到暂存库,使之能够被git管理跟踪到,然后执行git commit 提交到本地仓库:

1
2
3
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'

然后就可以使用git push将代码提交到远程仓库了,但这时你项目的本地仓库并没有和远程仓库建立连接,所以需要使用git remote add命令添加一个远程仓库地址:

1
2
# $ git remote add <name(远程仓库简写名称)> <url(远程仓库地址)>   
$ git remote add origin http://gitserver/test.git

添加好之后使用git push提交代码,这里需要注意的是,虽然添加了远程仓库了,如果没有执行过git pull或git fetch命令拉取远程仓库文件,git并不知道本地的当前分支要提交到远程仓库的哪个分支,所以在添加好远程仓库之后,我们第一次提交就需要使用git push -u来提交代码,这样会使本地的当前分支与远程分支关联起来,之后就可以直接使用git push提交就可以了:

1
2
# $ git push -u <name(远程仓库简写名称)> <branch远程仓库名称>
$ git push -u origin master

Ps: 初始化后本地仓库会默认带有一个master的本地主分支。

git push -u用于远程仓库是空仓库的时候,第一次提交所使用的的。

克隆现有的仓库

如果你想获取某个远程已经存在的仓库,拉取它的项目,这时就要用到git clone命令。

Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。 当你执行 git clone 命令的时候,默认配置 下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。

克隆仓库的命令是 git clone <项目地址> 。 比如,要克隆 Git 的链接库 libgit2,可以用下面的命令:

1
$ git clone https://github.com/libgit2/libgit2

如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以通过额外的参数指定新的目录名:

1
$ git clone https://github.com/libgit2/libgit2 mylibgit

这会执行与上一条命令相同的操作,但目标目录名变为了 mylibgit。

Git 支持多种数据传输协议。 上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用SSH 传输协议,比如 user@server:path/to/repo.git 。

Ps: git clone后的项目会自动做分支关联,直接使用git push提交到远程仓库

暂存库与文件状态

git除了有本地仓库还会有一个暂存库,我们在使用git commit 提交代码的时候需要先把文件用git add添加到暂存空中,这样git就可以跟踪项目文件的状态,请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪未跟踪, 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后, 它们的状态可能是未修改,已修改或已放入暂存区。简而言之,已跟踪的文件就是 Git 已经知道的文件。工作目录中除已跟踪文件外的其它所有文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有被放 入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态,因为 Git刚刚检出了它们, 而你尚未编辑过它们。

检查当前文件状态

可以用 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
9
$ echo 'My Project' > README
$ 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 add 开始跟踪一个文件。 所以,要跟踪 README 文件,运行:

1
$ git add README

此时再运行 git status 命令,会看到 README 文件已被跟踪,并处于暂存状态:

1
2
3
4
5
6
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
  new file: README

只要在 Changes to be committed 这行下面的,就说明是已暂存状态,已暂存之后git就可以追踪文件状态,文件做内容修改后,也可以使用git status查看状态。

Ps: 文件执行过git add就会被git追踪到,不用每次修改都使用git add,只有新增的文件需要通过git add来暂存。

提交到本地仓库

通过git add 将文件提交到暂存库后,我们就可以使用git commit命令来把当前工作目录中已暂存过的文件包括新增或修改的都提交到本地仓库,在commit提交时需要携带本次提交的描述使用git commit -m '描述’来提交:

1
2
$ git add README
$ git commit -m '初次提交'

如果新建了一个文件,不想每次使用git add提交到暂存库,然后在提交到本地仓库,就可以使用 git commit -a 来提交,这个命令可以提交文件到本地仓库的同时还会添加到暂存库,后续被git追踪到:

1
$ git commit -am '初次提交'

分支管理

当我们创建一个git仓库时不管是远程仓库还是本地仓库,不指定的话都会默认携带一个master主分支,但在日常项目管理中通常都会存在多个分支的情况,所以git提供了git branch命令来管理分支。

远程仓库已经建立好的分支

通常情况下,像github、码云、这种远程git仓库都会提供分支建立的功能,可以在某个分支的基础上建立新的分支,我们使用git clone克隆下载项目后,分支都会自动下载到本地,可以先使用git branch -l来显示本地分支,还可以使用git branch -a来查看所有的分支包括远程分支:

1
2
3
4
5
6
$ git branch -l     ## 查看本地分支列表 假设远程分支都master develop
* master ## 本地只显示了一个主分支
$ git branch -a ## 查看包括远程分支的所有分支
* master ## *星号代表当前所在分支
remotes/origin/HEAD -> origin/master ## remotes 这种代表的是远程分支
remotes/origin/develop

但发现本地只显示了一个主分支master,其他分支虽然下载下来了,并没有在本地建立,这里我们可以使用git checkout来切换到远程已存在分支,然后git就会在本地建立这个分支并与远程分支关联:

1
2
3
4
5
6
$ git checkout develop   ## 切换到远程已经存在的develop分支
$ git branch -a
* develop ## 可以看到本地已经有develop分支了 自动做了关联
master
remotes/origin/HEAD -> origin/master
remotes/origin/develop

远程仓库与本地仓库未进行关联的分支

有时候我们在本地自己建立了一个分支,想和远程分支关联,这样的话就需要使用使用git branch -u来关联,首先使用git branch <分支名>创建一个新本地分支,然后执行git branch -u <仓库别名>/<所对应的远程分支名> <本地分支名> 与远程分支关联起来:

1
2
3
4
5
6
7
8
$ git branch dev		##创建一个 dev的本地分支
## git branch -u <仓库别名>/<所对应的远程分支名> <本地分支名>
$ git branch -u origin/develop dev ##与远程develop分支关联
$ git checkout dev
$ git branch -l
* dev
develop
master

或者 **git checkout -b <本地分支名> <仓库别名>/<所对应的远程分支名>**来关联,这个命令会创建一个新分支与远程分支关联,并且会切换到这个分支:

1
2
3
4
5
6
## $ git checkout -b <本地分支名> <仓库别名>/<所对应的远程分支名>
$ git checkout -b <dev> origin/develop
$ git branch -l
* dev
develop
master

删除本地分支

如果想删除本地分支的话很简单使用git branch -d命令,但这个命令只能删除merge合并后的分支,如果想强制删除需要使用git branch -D来删除:

1
2
$ git branch -d dev  ## 删除本地dev分支
$ git branch -D dev ## 强制删除本地de分支

提交本地分支到远程仓库

项目中通常本地仓库也会建立很多分支可能用于研究,用于临时版本或者用于功能模块开发,远程仓库不存在这个分支,这个时候想提交到远程仓库,我们还是可以使用git push命令,通过git push <仓库别名> <本地分支>:<远程分支> 来提交本地分支到远程分支:

1
2
3
$ git branch test   ## 创建本地test分支
## git push <仓库别名> <本地分支>:<远程分支>
$ git push origin test:test-origin ## 本地分支test提交到远程test-origin分支

删除远程分支

删除远程分支也是使用git push命令,通过**git push <仓库别名> :<远程分支名> 或者 git push <仓库别名> --delete <远程分支名>**来删除远程分支:

1
2
3
4
## git push <仓库别名> :<远程分支名>
## git push <仓库别名> --delete <远程分支名>
$ git push origin :dev ##删除远程dev分支
$ git push origin --delete dev ##删除远程dev分支

代码合并

尽情期待