大家好,我是 17 。
本文详细介绍 git clone 命令的使用方法和应用场景。
为了讲述方便 git 版本 2.32.1。环境为 linux centos 7。
在讲具体的命令之前,我们需要先看张图,理解了这张图,对于理解后面的命令会有帮助。
主要分三部分:远程仓库(remote),本地仓库(repository)和工作区(workspace)。本地仓库和工作区之间还有一个暂存区(index)。
远程仓库(remote):作用是同步代码。每个成员把自己的代码 push 到远程仓库,再从远程仓库 pull 来更新代码。
本地仓库(repository):做为分布式管理仓库的特点:每个本地仓库都拥有完整的代码和历史记录。保存记录的功能无需要联网,可以先保存在本地。 执行 git commit
就是把代码提交到本地仓库。
工作区(workspace):对应的是本地分支代码,是我们平时写代码的地方。
暂存区(index):暂存区标记了当前工作区中那些内容是被 Git 管理的。git add
会把内容加到暂存区。添加到暂存区不会有记录。我们的代码没有完成,可以先暂存,等差不多了,再提交。
为了能方便练习,最好能建一个远程仓库。
打开 https://gitee.com/projects/new gitee 的新建仓库页面
输入仓库名称 git-learn,其它的都可以不填,点下面的 “创建” 按钮。
新建成功后显示如下界面
点右边的复制按钮(红框内的图标)把地址复制下来,粘贴到 git clone 后面。
git clone [email protected]:iam17/git-learn.git
首次执行的时候,会问你
Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入 yes 回车,拉取失败了。
fatal: Could not read from remote repository.
因为我们用的是 ssh 方式,所以需要把公钥放到 gitee 上面。
生成公钥很简单,看这个 帮助页面
放好公钥后,再次执行clone 命令
git clone [email protected]:iam17/git-learn.git
warning: You appear to have cloned an empty repository.
输出个 warning,说 clone 了一个空的仓库,这个不用管它,本来就是空的。
你也可以用 github,不过可能会不打开,而且速度可能很慢。
执行 clone 命令默认会拉取远程仓库的所有内容。
git clone [email protected]:iam17/git-learn.git
clone 命令是一个复合命令,相当于连续执行了下面三个命令。
git remote add origin [email protected]:iam17/git-learn.git
git fetch
git checkout master
首先添加远程仓库 origin
origin 是约定俗成的远程仓库的默认名,没什么特别的含意。如果不满意,可以修改
git remote rename origin bananer
没有特别的原因,这个名字最好别改。
然后从远程仓库拉取所有代码
所有远程分支在本地是只读的。可以查看已经拉取的远程分支
git branch --remote 或 git branch -r
远程分支存放在位置在
.git/refs/remotes/origin/
最后根据远程默认分支建立本地分支
远程分支是只读的,不能修改。要想在本地修改,需要建立本地分支。clone 命令默认会根据远程默认分支建立本地分支。
cat .git/refs/remotes/origin/HEAD
输出:ref: refs/remotes/origin/master
确认远程默认分支为 master 后,clone 命令接着建立本地 master 分支,并和远程 master 分支做关联。
clone 命令完成后,我们现在就可以在本地 master 分支修改,提交,最后执行 git push
,把 master 分支更新到远程仓库。git push
是省略写法。因为现在只有一个仓库,本地 master 也只有一个远程跟踪分支。完整写法:
git push origin master:master
执行 git push
这个简写命令如果失败,请检查 git 配置 push.default=simple
git 的默认设置就是 simple。 如果没有动过,就不用管它。查看 git 配置:
git config --list
如果想修改其它远程仓库的其它分支怎么办?很简单,只需要一句命令:
git checkout dev
这个命令完成了两项工作。
我们在本地分支 dev 下修改,提交,最后执行 git push
,把 dev 分支更新到远程仓库的 dev 分支。
git checkout 的分支必须已经 fetch 到本地,否则报错。可能得请先执行 git pull
如果新建的分支远程仓库里没有,需要先新建本地分支。
# 建立本地分支 feature
git checkout -b feature
# 做修改,提交到本地. git commit ...
# 提交到远程,会在远程新建 feature 分支
git push --set-upstream origin feature
git push --set-upstream origin feature
有两个作用
你肯定好奇,如果远程仓库有 feature 分支会怎么样?那肯定失败。如果远程仓库有 feature ,请按上面的 “修改远程仓库的其它分支” 的方案执行。
git ls-remote ,这个命令直接访问远程仓库,查看获得远程分支的完整列表。根据这个列表,你就知道是新建还是修改了
按上面的方法来做,无需自己去设置跟踪分支,git 自动给你完成,push 、pull 命令也会简化。虽然在技术可以从一个远程分支 check 出多个本地分支,但在实操上不建议这么做。一个远程分支只 check 一个同名的本地分支。如果有多个任务同时进行,可以从这个本地分支 check 出多个分支。任务完成,所有分支合并到这个唯一本地跟踪分支,由这个分支同步到远程仓库。
clone 命令默认是 clone 整个仓库。虽然有两个参数,可以 clone 部分仓库,--depth
和 --single-branch
,但是对于新手来说,不要用这两个参数。因为设置这两个参数后, 大概率会影响后面的正常使用。收益只是首次 clone 的时候快一些而已,得不偿失。
如果仓库确实需要放很多很大的文件,可以考虑用中央式版本管理系统,比如 svn。
本文到这里就结束了,谢谢观看。