从这里开始

在要建为 git 仓库的文件夹中运行命令行或者 git bash,然后运行

1
git init

在该命令执行完后,会在当前目录中生成一个 .git 文件夹,这个是 git 的版本库,除去 .git 外,剩下的地方为工作区。当然也可以通过 git clone <repo> [<dir>] 来将一个仓库拷贝到本地,repo 的话可以用这个地方的 HTTPS 或者 SSH 都可以:

此时再在 git 中新建文件的时候它不会被跟踪,也就是意味着即使你修改了它,然后提交修改的时候与它没有关系。

使用 git add <name> 来跟踪一个目录或者一个文件

如果不想要再跟踪某个文件或者目录,使用

  • git rm <name> --cached ,那么不再跟踪该文件
  • git rm <name> -f,那么将删除该文件

一般使用 git 开始工作的流程是:

  1. git fetch [<repo>] 从仓库获取更新,然后再用 git merge <branch> 将下载下来的分支合并到当前分支
  2. 在本地修改文件,然后用 git add <name> 暂存修改的文件
  3. 检查确认修改后,用 git commit -m <message> 提交更改。
  4. 最后通过 git push 将本地的分支版本上传到远程仓库并合并。

这里面涉及本地文件的状态、分支以及远程仓库等,接下来将分别介绍这些内容以及每个命令具体怎么使用。

本地文件

在本地仓库中,本地文件的状态分为 5 类:未跟踪(Untracked)、未修改(Unmodified,版本库中的文件与本地文件一致)、已修改(Modified)、已暂存(Staged)以及已提交(Committed)。下面这张图很好地展示了几种状态之间的互相转化。所以这个手绘边框的风格是怎么弄的555,求浇浇

五种状态之间的转换

其实可以把已提交和未修改合并。可以使用 git status 查看工作目录中文件的状态。

提交更改

在第一次提交前,需要先设置用户信息,包括用户名和邮箱:

1
2
git config --global user.name <username>
git config --global user.email <email>

如果去掉 --global 那么仅对当前仓库有效。

使用 git add 命令可以将文件保存到暂存区。接着使用

1
git commit -m <message>

将暂存区的内容添加到本地仓库,其中 <message> 是一段备注信息,Windows 下用双引号,Linux 下用单引号。直接使用 git commit 要求工作目录下没有文件处于已修改状态。可以添加 -a 参数,这样修改文件后就不需要使用 git add 将其添加到暂存区。

也可以通过下面命令实现提交暂存区指定文件到本地仓库:

1
git commit <file1> <file2> ... -m <message>

每次提交的内容都会生成一个 Hash 值,代表这个快照版本。可以使用 git log 来查看历史提交和对应的 Hash 值,也可以查看提交该版本的用户(这极大地方便了查这个锅是谁写的,然后发现小丑竟是我自己)。加入 --graph 参数可以用字符绘出分支的合并情况。

回退 如果出现错误提交的时候,可以用下面两个命令来回到一个历史版本:

  • git reset --hard <版本号>

    注意该命令会删除当前版本和回退的版本之间的其他版本。

  • git revert -n <版本号>

    该命令相当于新建一个历史版本的副本。

贮藏功能 假如我写代码写到一半,需要切换到另一个分支,一种解决方案是先 git commit,另一种话就是是用贮藏功能。

  • git stash 将当前分支下的所有修改贮藏
  • git stash apply 从另一分支切换回来后,通过这条命令恢复之前的修改。

更多的 git stash 的用法可以看一下这篇教程,这里不再赘述了。

分支

一条分支允许一条独立的开发线。使用分支也就意味着你可以从开发主线上分离来,然后在不影响主线上继续工作。

git 的分支实际上是一个指向版本快照的一个指针。比如我们现在在 main 分支上工作,提交更改得到了一个新的快照版本 a,那么现在 main 分支也会向前移动,变为一个指向版本 a 的指针。

新建分支

新建分支的话相当于在当前快照版本上新建一个指针。通过

1
git branch <branch name>

来新建一个分支。接着通过

1
git checkout <branch name>

来切换到新的分支上。这里 git 会直接把工作目录变为目标分支中最后一次快照版本,所以一般情况下也需要提交当前工作目录下的更改。也可以使用 git checkout -b <branchname> 来实现新建并切换分支。

直接使用 git branch 可以查看有哪些分支,前面带 * 的表示是当前分支。

另外通过 git branch -d <branchname> 可以删除分支。

分支合并

某些分支可能会有一些独立的内容,比如添加一些新功能等,但最终你会希望将其合并回主分支。

通过 git merge <branchname> 可以将指定分支与当前分支合并。

如果两个分支对同一文件进行了不同修改,此时再用 git merge 进行合并的时候会产生冲突。此时用 git status 可以查看哪些文件产生了冲突。

  • 如果该文件在一个分支中被删除了,那么 git 则会保留这个文件,但会提示你这个文件在合并中产生冲突
  • 如果两个文件被进行了不同的修改,那么 git 产生冲突的地方在文件中标识出来

完成这些修改后再 git commit 结束合并并生成新的快照版本。

远程仓库

使用远程仓库的话方便多人协作,一般可以使用 Github,也可以自己搭 git 服务器。使用 Github 的一般需要先准备一下 SSH 授权验证,具体教程可以参考菜鸟教程搭博客时弄过了,这里懒得自己写了。

对于远程仓库的设置操作使用 git remote,具体用法如下:

  • git remote 查看远程仓库的名称
  • git remote -v 查看远程仓库名称和具体的地址
  • git remote add <name> <url> 添加一个指定名称的远程仓库
  • git remote rename <old name> <new name> 重命名一个远程仓库
  • git remote remove <name> 删除一个指定名称的远程仓库

在 git 中,工作区域可以分为 4 个:工作目录(Working Directory),暂存区(Stage/Index),版本库(Repository)、远程仓库(Remote Directory),在四个工作区域之间的转化之间操作如下图所示:

四个工作区域

  • git push <远程主机名> <本地分支名>:<远程分支名> 将本地的分支版本上传到远程并合并,当本地分支名与远程分支名相同的时候,远程分支名可以省略。使用 -u 参数可以指定推送目标后,此后可以直接使用 git push 进行上传。
  • git fetch <repo> 将远程仓库的内容同步到本地仓库,但不会更改工作目录中的内容,当没有指定远程仓库的时候将从 origin 获取。
  • git fetch <repo> <branch name> 获取远程仓库中某个特定的分支
  • git pull <repo> 将远程跟踪的分支更新到本地分支,相当于 fetch + merge。使用 git checkout --track <remote branch> 将新建一个跟踪该远程分支的同名分支。