从这里开始
在要建为 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 开始工作的流程是:
- 用
git fetch [<repo>]
从仓库获取更新,然后再用git merge <branch>
将下载下来的分支合并到当前分支 - 在本地修改文件,然后用
git add <name>
暂存修改的文件 - 检查确认修改后,用
git commit -m <message>
提交更改。 - 最后通过
git push
将本地的分支版本上传到远程仓库并合并。
这里面涉及本地文件的状态、分支以及远程仓库等,接下来将分别介绍这些内容以及每个命令具体怎么使用。
本地文件
在本地仓库中,本地文件的状态分为 5 类:未跟踪(Untracked)、未修改(Unmodified,版本库中的文件与本地文件一致)、已修改(Modified)、已暂存(Staged)以及已提交(Committed)。下面这张图很好地展示了几种状态之间的互相转化。所以这个手绘边框的风格是怎么弄的555,求浇浇
其实可以把已提交和未修改合并。可以使用 git status
查看工作目录中文件的状态。
提交更改
在第一次提交前,需要先设置用户信息,包括用户名和邮箱:
1 | git config --global user.name <username> |
如果去掉 --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>
将新建一个跟踪该远程分支的同名分支。