文章目录
- 1. Git-基础
- 1.1 获取 Git 仓库
- 1.2 记录每次更新到仓库
- 1.3 远程仓库的使用
- 2. Git-分支
- 2.1 Git 分支的新建与合并
- 2.2 Git 分支的管理
1. Git-基础
1.1 获取 Git 仓库
通常有两种获取 Git 项目仓库的方式:
- 将尚未进行版本控制的本地目录转换为 Git 仓库;
- 从其它服务器 克隆 一个已存在的 Git 仓库。
1. 在已存在目录中初始化仓库:
先进入文件夹:
$ cd /home/xx/codes/go/src/my_project
之后执行:
$ git init
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。
2. 克隆现有的仓库:
克隆仓库的命令是 git clone github_url
。比如可以用下面的命令:
$ git clone https://github.com/hualuo321/golearn.git
1.2 记录每次更新到仓库
现在我们的机器上有了一个 真实项目 的 Git 仓库,并从这个仓库中检出了所有文件的 工作副本。 通常,你会对这些文件做些修改,每当完成了一个阶段的目标,想要将记录下它时,就将它提交到仓库。
检查当前文件状态:
可以用 git status
命令查看哪些文件处于什么状态。
$ git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
这说明你现在的工作目录相当干净,所有已跟踪文件在上次提交后都未被更改过。
现在,让我们在项目下创建一个新的 README 文件。 如果之前并不存在这个文件,使用 git status
命令,你将看到一个新的未跟踪文件:
$ echo 'My project' > README
$ git status
On branch main
Your branch is up to date with 'origin/main'.
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)
在状态报告中可以看到新建的 README 文件出现在 Untracked files 下面。 未跟踪的文件意味着 Git 在之前的快照(提交)中没有这些文件;
跟踪新文件:
使用命令 git add
开始跟踪一个文件。 此时再运行 git status 命令,会看到 README 文件已被跟踪,并处于暂存状态:
$ git add README
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: README
提交更新:
现在的暂存区已经准备就绪,可以提交了。 在此之前,请务必确认还有什么已修改或新建的文件还没有 git add
过, 否则提交的时候不会记录这些尚未暂存的变化。
每次准备提交前,先用 git status
看下,你所需要的文件是不是都已暂存起来了, 然后再运行提交命令 git commit
:
$ git commit
编辑器会显示类似下面的文本信息(本例选用 Vim 的屏显方式展示):
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch main
# Your branch is up to date with 'origin/main'.
# Changes to be committed:
# new file: README
另外,你也可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行,如下所示:
$ git commit -m '功能1已完成'
[main e5eb4cb] 功能1已完成
1 file changed, 1 insertion(+)
create mode 100644 README
1.3 远程仓库的使用
为了能在任意 Git 项目上协作,你需要知道如何管理自己的远程仓库。 远程仓库是指托管在因特网或其他网络中的你的项目的版本库。
查看远程仓库:
如果想查看你已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出你指定的每一个远程服务器的简写。 如果你已经克隆了自己的仓库,那么至少应该能看到 origin ——这是 Git 给你克隆的仓库服务器的默认名字:
$ git remote
origin
你也可以指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
$ git remote -v
origin https://github.com/hualuo321/golearn.git (fetch)
origin https://github.com/hualuo321/golearn.git (push)
添加远程仓库:
运行 git remote add 添加一个新的远程 Git 仓库,同时指定一个方便使用的简写:
$ git remote add gol https://github.com/hualuo321/golearn
$ git remote -v
gol https://github.com/hualuo321/golearn (fetch)
gol https://github.com/hualuo321/golearn (push)
origin https://github.com/hualuo321/golearn.git (fetch)
origin https://github.com/hualuo321/golearn.git (push)
从远程仓库中抓取与拉取:
从远程仓库中获得数据,可以执行:
$ git fetch gol
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin
会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。
推送到远程仓库:
当你想分享你的项目时,必须将其推送到上游。git push <remote> <branch>
。
2. Git-分支
2.1 Git 分支的新建与合并
首先,我们假设你正在项目中愉快地工作,并且已经提交了几次更新。
现在,你决定要修补问题追踪系统上的 #53 问题,要新建并切换到该分支,运行 git checkout 并加上 -b参数:
$ git checkout -b iss53
Switched to a new branch 'iss53'
这相当于执行下面这两条命令:
$ git branch iss53
$ git checkout iss53
接着你开始尝试修复问题,在提交了若干次更新后,iss53 分支的指针也会随着向前推进,因为它就是当前分支。
$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'
目前已经提交了所有的修改,所以接下来可以正常转换到 master 分支:
$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
接下来,你得进行紧急修补。我们创建一个紧急修补分支 hotfix 来开展工作,直到搞定:
$ git checkout -b hotfix
Switched to a new branch 'hotfix'
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
有必要作些测试,确保修补是成功的,然后回到 main 分支并把它合并进来,然后发布到生产服务器。用 git merge 命令来进行合并:
$ git checkout main
$ git merge hotfix
Updating fe39e83..027d6b7
Fast-forward
index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
请注意,合并时出现了“Fast forward”的提示。由于当前 master 分支所在的提交对象是要并入的 hotfix 分支的直接上游,Git 只需把 master 分支指针直接右移。换句话说,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)。
由于当前 hotfix 分支和 master 都指向相同的提交对象,所以 hotfix 已经完成了历史使命,可以删掉了。使用git branch 的 -d 选项执行删除操作:
$ git branch -d hotfix
Deleted branch hotfix (was 027d6b7).
现在回到之前未完成的 #53 问题修复分支上继续工作:
$ git checkout iss53
Switched to branch 'iss53'
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
在问题 #53 相关的工作完成之后,可以合并回 master 分支。实际操作同前面合并 hotfix 分支差不多,只需回到 master 分支,运行 git merge 命令指定要合并进来的分支:
$ git checkout master
$ git merge iss53
请注意,这次合并操作的底层实现,并不同于之前 hotfix 的并入方式。Git 会用两个分支的末端(C4 和 C5)以及它们的共同祖先(C2)进行一次简单的三方合并计算。
这次,Git 没有简单地把分支指针右移,而是对三方合并后的结果重新做一个新的快照,并自动创建一个指向它的提交对象(C6)。
2.2 Git 分支的管理
- 显示当前所有分支:
git branch
- 删除某分支
git branch -d my_branch