其实我第一次用git,就是你这篇文章里的样子。

那个demo1.html。

vi demo1.html

工作区暂存区转换_git基本操作流程_工具技巧Git脚本编写

真的,一模一样。

当那一刻按下i的时候,认为整个世界都变得安静起来了,仿佛自己犹如一个真正意义上的程序员了。

<!DOCTYPE html>
<html>
        <head>
                <meta charset = "utf-8">
                <title>
                        hello world
                </title>
                <script type = "text/javascript">
                        window.onload = function()
                        {
                                let oBtn = document.getElementById("btn");
                                let oPra = document.getElementById("p0");
                                let number_0 = parseNumber(oPra.textContent);
                                oBtn.onclick = function()
                                {
                                        oPra.textContent = number_0 + 1;
                                        alert("finished!");
                                }
                        }
                </script>
        </head>
        <body>
                <button id = "btn">click this button to plus 1</button>
                <p id = "p0">0</p>
        </body>
</html>

然后git status,看着红字,完全不知道它在说什么。

git基本操作流程_工作区暂存区转换_工具技巧Git脚本编写

绿了,高兴。

红了,慌。

:wq

后来我发现,大多数人学Git,都卡在那个“暂存区”上。

到底什么是暂存区啊,我代码存哪儿了

有人跟我说,你就当它是购物车。

git status

不是。

购物车你放进去,结账的时候全买了。

git status --short 

但是暂存区的情况并非如此,你执行git add这个操作,就仿佛是将货物从货架取出来,然后紧握着放在自己的手里。

攥着,还没放进购物车。

然后你git commit,才扔进购物车。

git add demo1.html

这个比喻也很烂,我知道。

git add --all

但没办法,这东西本来就很抽象。

有位大哥制作了一款3D游戏,你将文件拖动到名为“暂存区”的那个格子之中,它便会从标记为“未追踪”的那块墙处飞到了命名为“已暂存”的那块墙那里。

我第一次看到那个动图,突然就懂了。

是这个东西,本来就不该用命令行教。

为什么我们总在怕git

有个用了十年Git的老程序员,写了一篇吐槽,说——

git reset demo1.html

我每天都在用,但我并不喜欢它。

我所需求的并非哈希串,并非分布式呈现,并非那些于我而言压根用不上的所谓“强大”。

我只是想:改个东西,存一下,万一改崩了,能回去。

就这么简单。

他想要一个叫“Gitlite”的东西。

git commit -m git "the first commit"

我也想要。

分支?平行宇宙,但你会迷路

很多人把分支比作平行宇宙。

听起来很酷。

可是实际情况是,你从main切换出去,吭哧吭哧用了三天时间去修改,再切换回来时,已然忘掉自己当初为何要在那个时间节点分裂出去了。

像不像你半夜两点冒出来的创业灵感。

第二天醒来:这啥。

git pull 报错那一刻,血压拉满

你原文里写了:

git pull,然后出错了。

fatal: to merge。

你加了参数,解决了。

但你没写那一瞬间的感受。

就是那种,明明每一步都对,但它就是不给过的委屈。

而后我晓得了,那并非是你的过错,乃是两个版本自同一个祖先分支出去的时间太过漫长,以至于彼此之间谁都认不出谁了。

你得把它们摁在一起,说:

你们以前是一家人。

### 有没有不这么难的办法

其实有。

git remote add origin https://gitee.com/hhhmoonhhh/demo_of_mine

少用命令行,多用界面。

这不是懦弱,这是跟工具和解。

有用VSCode的Git图形的人,有使用GitHub Desktop的人。

那些,点一下便能够add,点一下便能够commit,在冲突之际,红绿蓝标识得极为清晰明了。

这才是人该用的东西。

你看那些老程序员,嘴上说着命令行最高效。

但你真看他,也是git gui。

写完那个demo1.html之后呢

你会遇到冲突。

你会忘记push。

你会把密钥放错地方。

git pull origin master --allow-unrelated-histories

你会看着那串长长的commit hash,像看天书。

但是,你也会在某一日,进行git log --oneline这样的操作,然后,突然发觉——。

哦,原来我改了这么多版。

每一版都有记录。

每一版都还活着。

这大概就是版本控制,最温柔的地方。

不是控制。

是保留。

git pull origin master

你那天晚上写demo1.html的时候,心里想的是什么呢。

我已经忘了。

但Git还记得。

git push origin master

谢谢你看完。

下次遇到git pull报错,记得先深呼吸。

是它不够懂你。