没看过第一篇的童鞋可以先回头看看第一篇。
图解Git 命令行(一)
先放张图,图图写了一份代码,上传到了远程仓库,这时候妹子可以通过 clone 拿到所有代码,也可以进行图图能进行的所有操作,这也是多人开发的大致流程,下面会慢慢道来。
当然 push 和 pull 的过程并不会顺利,没错,是冲突~ 哈哈 令人头疼。
0. git init
先说说初始化吧。
git init
这条命令可以让我们在工作目录中初始化本地仓库,使用后,本地会出现名为「.git」 的文件,如果看不到,请打开隐藏文件夹选项,Git 所需的数据和资源都在里面。
注意,要在你需要上传项目的最外层使用该命令,这样才能包裹所有文件。
1. git add
该命令可以让文件被添加到缓存中,记住只是添加到缓存区。只有在执行 commit 命令后才会被提交到本地仓库中。
正常情况下我们都是把所有文件都添加进去的,如果某些不需要被添加的可以配置「.gitignore」
如果是单独添加某个文件或者文件夹。
git add xxx
xxx 代表文件或者文件夹。
如果是添加全部
git add .
注意是空格+「.」
2. git tag
看过第一篇文章的童鞋肯定知道,分支很容易被人为移动,并且当有新的提交时,它也会跟着移动。
那么有什么东西可以永久性的指向某个提交记录呢?当然有。
我们可以通过下面命令在提交记录上打上一个标签,如图。
git tag v1 C1
当然如果你不指定提交记录,Git 就会在 「HEAD」 所在的位置打上标签。
你问我标签有什么用?
当我们打了标签之后,可以把标签看做固定在这个提交记录上的分支,方便记忆和管理。
如上图所示,我们可以直接通过下面命令来切换到 C1 上。
git checkout v1
3. git describe
该条命令可以让你找到某个提交记录或者分支或者标签下(总之就是任何能被 Git 识别成提交记录的引用)离其最近的一个标签以及相差多少个提交记录,具体为「标签+相差数量+g哈希值前几位」
针对下图,我做出如下命令。
git describe side
返回「v1_1_gC4」
意思是离「side」 最近的标签是「v1」他们相差 1 个提交记录,「side 」的哈希值为「C4」
git describe C3
返回「v1」
当指定的引用存在某个标签时,则只输出标签名称
git describe C5
返回 v1_1_gC5
git describe C6
返回v1_2_gC6
4. git clone
下面是有关远程仓库的命令了。
那么什么是远程仓库呢?你可以理解为把本地仓库的复制品上传到一个可以被共享的环境里。就算本地仓库的东西全部不见了,你也可以从远程仓库在「拷贝」一份下来。
针对远程仓库的操作实际上可以归纳为以下两点:向远程仓库传输数据以及从远程仓库获取数据。
如图我通过 clone 命令,使本地仓库从远程仓库中复制了一个一模一样的仓库。
虚线部分代表远程仓库。
git clone xxx
xxx 代表地址
这时候我们可以看到本地仓库「master」 分支上多了一个分支「o/master」即「远程分支」
那么 o 代表什么呢? 其实就是远程仓库的名字, 平常我们默认创建 Git 会有默认的远程仓库名字「origin」
我们可以尝试切换到「o/master」上进行一次提交,看看会怎么样。
git checkout o/master
git commit -m "First log"
结果发现「o/master」并没有跟着 C2 动,并且 Git 进入了「HEAD」 分离的状态。
只有当远程仓库上的分支做出相应的更新时,本地再去执行更新相关命令(如 git pull 下面会说)后远程分支才会更新。
我们也可以理解为本地的远程分支可以展示远程仓库中分支的当前状态。前提是本地为最新的更新。
5. git fetch
通过该命令可以从远程仓库获取数据,当然远程分支也会做出相应的更新,来反应最新的远程仓库状态。
总的来说 git fetch 完成了下面两件事情。
- 从远程仓库下载本地仓库中缺失的提交记录
- 更新远程分支指针(如 o/master)
注意!git fetch 并不会改变你本地仓库的状态,也不会更新「master」 分支,也没有修改磁盘上的文件。
不要误以为执行了 git fetch 后本地仓库和远程仓库就同步了!
你可以理解为 git fetch 只是单纯的进行了下载操作。
6. git pull
那么下载下来的数据如何更新到本地上去呢?
其实方法有很多种,当远程分支有更新时,你可以像合并本地分支那样来合并远程分支。也就是说你可以执行以下命令:
- git cherry-pick o/master
- git rebase o/master
- git merge o/master
- 等等
我们来操作一下吧。
git fetch
git merge o/master
我们可以看到首先下载了 C3 然后远程分支指向了 C3,这时候通过 merge 来将本地和远程合并达到更新代码的效果。
当然因为这个需求很常见,所以 Git 有专门的方法来执行者这两个步骤,也就是 git pull,我们最常用的命令之一。
其实 git pull 就是 git fetch 和 git merge 的缩写!
7. git push
我们学会了下载远程仓库的内容,当然我们也要懂得分享咯,那么和下载相反的操作是什么呢? 没错,是上传,git push!
我们执行完下面命令,发现远程仓库里多了 C2,因为我们把本地的 C2 更新上去了,同时,远程分支也指向了 C2,也印证了上面说的,远程分支展示远程仓库的当前状态,当然前提也是本地为最新的更新。
git push
8. 冲突的解决
通过上边我们知道提交代码好像不是很难 ╮(╯▽╰)╭啊
那么是什么问题让我们感到困难呢?
假设我们周一开始写需求,到了周五准备提交代码了,突然发现这几天你的同事在疯狂提交代码(确定不是猪队友?开玩笑~~),这时候同事的代码才是最新的,而我们的代码反而基于旧版了。
在下图的状况下,我们用 push 命令,但是发现不起作用了,原因是我们最新的代码 C3 是基于 C1 的,而远程仓库中 C1 已经更新到 C2 了,所以 Git 拒绝了这次 push。
这时候我们该怎么办呢?
因为 Git 只允许合并远程仓库最新的代码后,才能分享我们的代码。
所以我们先把远程仓库的代码下载下来,然后在本地合并后,再去 push 就好了。
所谓合并,就是把本地仓库和远程仓库不同的地方给他一个最终版本,正常情况下我们都是使用远程仓库的改动。
具体命令如下:
git fetch
git rebase o/master
git push
命令太多太长了? 之前我们有说 git pull 就是 git fetch 和 git merge 的缩写!
这里可以用以下缩写,如下图。
git pull --rebase
git push
当然我们也可以选择用 merge 合并代码,然后再去 push。
git fetch
git merge o/master
git push
而这里同样可以用缩写。
git pull
git push
9. git push 指定参数
没错,push 后面也可以跟参数。
我们先来看看下面代码。
git checkout C0
git push origin master
前面只是简单的切换到 C0 上。
后面可以理解为获取到本地仓库中的「master」分支上所有的提交,然后到远程仓库「origin」中找到「master」分支,将远程仓库中没有的提交记录都添加上去。
咱们在看看下面这种情况
git checkout C0
git push
同样也是切换到 C0 ,但是我们的 push 后面没有指定参数,这时候 push 就失败了。
因为我们所选中的「HEAD」没有任何记录。
好处就在于,我们不需要在当前分支 push,可以在任意分支 push 你想要的分支。
当然还有更酷的表达方式。
冒号「:」连接了需要 push 的内容和目标。
比方说下面的代码。
git push origin foo^:master
当你的目标是一个不存在的分支时,Git 会自动帮你创建。
git push origin master:newBranch
还有一种古怪的写法,「:」前面不加任何参数,而后缀是分支的名字。
这种写法会导致分支被删除。
git push origin :foo
10. git fetch 指定参数
push 可以跟参数,当然 fetch 也行咯。
git fetch origin foo
在强调一次,fetch 只是下载提交记录,并不会更新你的本地非远程分支。
冒号「:」分割的形式也同 push 类似。
当然如果指定的分支不存在也是会自动创建的。
git fetch origin foo~1:bar
和上面 push 删除分支不同,当 fetch 的「:」前面为空,情况恰恰相反。
Git 会在本地该创建分支。
git fetch origin :bar
10. git pull 指定参数
学完了带参数的 fetch 和 push,那么带参数的 pull 也就很简单啦。
git pull origin master
冒号「:」分割的形式也类似。
指定的分支不存在也是会自动创建的。
下面的命令
首先本地创建了一个叫「foo」的分支,然后从远程仓库中的「master」 分支中下载提交记录 C2,然后让「foo」指向 C2,最后再 merge 到我们的当前检出的分支 bar 上。
git pull origin master:foo
参考自 https://github.com/pcottle/learnGitBranching
最后推荐一个可以模拟 git 操作的网站。
https://learngitbranching.js.org/
喜欢的可以关注一下咯!
喜欢的可以关注一下! O(∩_∩)O哈哈~