git 是一种开源的,用于软件开发和管理的工具,有了它,无论对于个人还是团队,都对项目开发都有着很大的便利。

今天,我们来说说那些 git 的那些最基本的命令。

首先,在 git 上建立一个 test1 的文件夹,请注意,git 里面喜欢称呼文件夹为 repository, 就像这样。




git 添加新文件夹到仓库_git add整个文件夹


与之对应的,在本地也建立一个 test1 文件夹,你可以自己选取文件夹的位置。进入你本地的 test1 文件夹,启动 cmd 或者 git bash。

输入第一个命令:


git init


好了,从现在开始,这个本地的 test1 文件夹已经是一个 git 文件夹了,你可以在接下来对其使用更多的 git 命令了。对于初学者而言,理解到这里就够了。这一步也会自动帮你建立一个 master 分支(如果你不明白什么是分支,没关系,你可以继续往下看)。

执行完这一步之后,你会发现本地的 test1 文件夹里面多了一个 .git 文件夹。


git 添加新文件夹到仓库_git add整个文件夹_02


接着,输入命令


git remote add origin https://github.com/your_account/test1.git


在完成了这一步时,git 就建立了你本地的 test1 和 git 上 test1 之间的映射关系,剩下来的一切命令就不需要你指定远程的文件夹是什么了。

在本地建立一个 a.txt 文件,在文件内部输入 aaa,保存退出。此时,这个 a.txt 文件还不属于 你本地的 test1 文件夹。

输入


git add .


此时,你新建立(相对于上次 commit 的)的所有文件,(在本例中仅仅为 a.txt)被添加到了一个临时空间里面,只有当你 commit 了以后,临时空间里的所有文件会被正式上传到当前的分支里。

输入


git commit -m "1"


至此为止,a.txt 已经正式属于本地 test1 下的 master 分支了。


git 添加新文件夹到仓库_git_03


其中 -m 后面的参数为对这一次 commit 的简单描述。请注意,在正式的工程项目中,这个参数不能随随便便的填写。

接着,我们输入


git push -u origin master


执行后 git 会让你输入你的 git 账号和密码,输入完后,本地的 test1 master branch 下的内容会正式地传入到远程 git 上。请注意,由于你之前建立了 origin 和 https://github.com/your_account/test1.git 之间的映射关系,所以 git 知道 origin 代表什么。

远程中 test1 下也有了 a.txt


git 添加新文件夹到仓库_git_04


接下来在本地建立新的 branch branch1 并切换至 branch1,我们使用命令


git checkout -b branch1


打开本地的 test1 文件夹,我们发现,a.txt 文件依然存在,这是因为 branch1 是在你添加完 a.txt 的 master 分支后建立的,我们再添加一个 b.txt,写 bbb,保存退出。

请注意,此时此刻 b.txt 还不属于 git。

我们在切换回 master


git checkout master


观察本地 test1 文件夹,我们发现 b.txt 依然存在,这是因为 b.txt 还不属于 git。


git 添加新文件夹到仓库_git add整个文件夹_05


再次切回 branch1,输入


git checkout branch1


再输入


git add .
git commit -m "2"


此时 b.txt 已经完全隶属于 branch1 分支了,因为你 commit 了。

切回 master


git checkout master


发现 b.txt 不存在。


git 添加新文件夹到仓库_github_06


切回 branch1,把 a.txt 内容改为 aaaaa。


git checkout branch1


再输入


git add .
git commit -m "3"


接着切回 master


git checkout master


点开 master 下的 a.txt,发现其也被修改了。

在 master 下建立 b.txt,输入 bbbbb (5个),commit。


git add .
git commit -m "4"


切回 branch1,

点开 b.txt,发现 b.txt 中间只有 3 个b。

请问,为什么 a.txt 的修改可以在分支内部迁移,而 b.txt 不行?

输入


git merge master


此时报错:


CONFLICT (add/add): Merge conflict in b.txt
Auto-merging b.txt
Automatic merge failed; fix conflicts and then commit the result.


输入


git add .
git commit -m '5'


打开 b.txt 发现其变为:


<<<<<<< HEAD
bbb
=======
bbbbb
>>>>>>> master


切回 master,输入


git merge branch1


打开 b.txt

发现 b.txt 依然为


<<<<<<< HEAD
bbb
=======
bbbbb
>>>>>>> master


请问此时 b.txt 为什么不是


<<<<<<< HEAD 
<<<<<<< HEAD 
bbb
======= 
bbbbb 
>>>>>>> master
=======
bbbbb
>>>>>>> master


输入

在 master 添加 c.txt 并输入 ccc 保存。输入


git add .
git stash


发现 c.txt 消失了。这是因为 c.txt 被保存在了栈里面,输入


git 添加新文件夹到仓库_git add整个文件夹_07


git stash pop


之前的环境被弹出,c.txt 重新出现


git 添加新文件夹到仓库_github_08


再输入


git stash


然后输入


git stash apply


此时存在 c.txt 的环境会被回复,但是与使用 pop 不同的是,存在 c.txt 的环境依然存在栈里面。

我们再输入


git reset--hard origin/master
git checkout


发现本地又与远程 git 保持一致了。


git 添加新文件夹到仓库_github_06


输入


git stash apply


发现只有 c.txt 被恢复。


git 添加新文件夹到仓库_git add整个文件夹_10


当你搞懂了本文的所有细节,相信你就不仅仅是一个 git 的新手了。