图解Git 命令行(二)

没看过第一篇的童鞋可以先回头看看第一篇。
图解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」 所在的位置打上标签。

-w420

你问我标签有什么用?
当我们打了标签之后,可以把标签看做固定在这个提交记录上的分支,方便记忆和管理。

如上图所示,我们可以直接通过下面命令来切换到 C1 上。

git checkout v1
3. git describe

该条命令可以让你找到某个提交记录或者分支或者标签下(总之就是任何能被 Git 识别成提交记录的引用)离其最近的一个标签以及相差多少个提交记录,具体为「标签+相差数量+g哈希值前几位」

针对下图,我做出如下命令。

-w1101

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 代表地址

-w426

这时候我们可以看到本地仓库「master」 分支上多了一个分支「o/master」即「远程分支」
那么 o 代表什么呢? 其实就是远程仓库的名字, 平常我们默认创建 Git 会有默认的远程仓库名字「origin」

我们可以尝试切换到「o/master」上进行一次提交,看看会怎么样。

git checkout o/master

git commit -m "First log"

-w427

结果发现「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!-w99

我们执行完下面命令,发现远程仓库里多了 C2,因为我们把本地的 C2 更新上去了,同时,远程分支也指向了 C2,也印证了上面说的,远程分支展示远程仓库的当前状态,当然前提也是本地为最新的更新。

git push

8. 冲突的解决

通过上边我们知道提交代码好像不是很难 ╮(╯▽╰)╭啊

那么是什么问题让我们感到困难呢?
假设我们周一开始写需求,到了周五准备提交代码了,突然发现这几天你的同事在疯狂提交代码(确定不是猪队友?开玩笑~~),这时候同事的代码才是最新的,而我们的代码反而基于旧版了。

在下图的状况下,我们用 push 命令,但是发现不起作用了,原因是我们最新的代码 C3 是基于 C1 的,而远程仓库中 C1 已经更新到 C2 了,所以 Git 拒绝了这次 push。
这时候我们该怎么办呢?

-w415

因为 Git 只允许合并远程仓库最新的代码后,才能分享我们的代码。
所以我们先把远程仓库的代码下载下来,然后在本地合并后,再去 push 就好了。
所谓合并,就是把本地仓库和远程仓库不同的地方给他一个最终版本,正常情况下我们都是使用远程仓库的改动。

具体命令如下:

git fetch

git rebase o/master

git push

命令太多太长了? 之前我们有说 git pull 就是 git fetch 和 git merge 的缩写!
这里可以用以下缩写,如下图。

git pull --rebase

git push

rebase

当然我们也可以选择用 merge 合并代码,然后再去 push。

git fetch

git merge o/master

git push

而这里同样可以用缩写。

git pull

git push

merge

9. git push 指定参数

没错,push 后面也可以跟参数。
我们先来看看下面代码。

git checkout C0

git push origin master

前面只是简单的切换到 C0 上。
后面可以理解为获取到本地仓库中的「master」分支上所有的提交,然后到远程仓库「origin」中找到「master」分支,将远程仓库中没有的提交记录都添加上去。

merge

咱们在看看下面这种情况

git checkout C0

git push

同样也是切换到 C0 ,但是我们的 push 后面没有指定参数,这时候 push 就失败了。
因为我们所选中的「HEAD」没有任何记录。

merge

好处就在于,我们不需要在当前分支 push,可以在任意分支 push 你想要的分支。

当然还有更酷的表达方式。
冒号「:」连接了需要 push 的内容和目标。
比方说下面的代码。

git push origin foo^:master

merge

当你的目标是一个不存在的分支时,Git 会自动帮你创建。

git push origin master:newBranch

merge

还有一种古怪的写法,「:」前面不加任何参数,而后缀是分支的名字。
这种写法会导致分支被删除。

git push origin :foo

merge

10. git fetch 指定参数

push 可以跟参数,当然 fetch 也行咯。

git fetch origin foo

merge

在强调一次,fetch 只是下载提交记录,并不会更新你的本地非远程分支。

冒号「:」分割的形式也同 push 类似。
当然如果指定的分支不存在也是会自动创建的。

git fetch origin foo~1:bar

merge

和上面 push 删除分支不同,当 fetch 的「:」前面为空,情况恰恰相反。
Git 会在本地该创建分支。

git fetch origin :bar

merge

10. git pull 指定参数

学完了带参数的 fetch 和 push,那么带参数的 pull 也就很简单啦。

git pull origin master

merge

冒号「:」分割的形式也类似。
指定的分支不存在也是会自动创建的。
下面的命令
首先本地创建了一个叫「foo」的分支,然后从远程仓库中的「master」 分支中下载提交记录 C2,然后让「foo」指向 C2,最后再 merge 到我们的当前检出的分支 bar 上。

git pull origin master:foo

merge


参考自 https://github.com/pcottle/learnGitBranching

最后推荐一个可以模拟 git 操作的网站。

https://learngitbranching.js.org/

喜欢的可以关注一下咯!

喜欢的可以关注一下! O(∩_∩)O哈哈~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值