我的.bash_aliases
文件中有这个:
alias gitlearn='cd; rm -rf gitlearn; mkdir gitlearn; cd gitlearn; git init; git commit --allow-empty -m"Add empty, initial commit"'
每当我想探索或练习 git 时,我只需输入gitlearn
,然后我就会进入~/gitlearn/
一个新的 repo 和一个第一个空提交,这使得你可以重新设置你的第一个实际提交,因为你需要在之前指定提交变基时要移动的第一个提交。
然后我只需使用一堆 linux 命令来快速进行我需要的任何设置。我已经测试了分支和合并策略,将完全独立的、不相关的 repos 的提交(尊重日期)交错到一个新的、常见的第三个 repo 中,测试分支概念,探索了git log --graph
真正疯狂合并的输出会发生什么,让我自己熟悉临时克隆上的命令(如 dreaded filter-branch
),甚至弄清楚实际需要什么(你可以自己手动创建)才能拥有一个有效的 git repo。
从一个空目录开始:
~/gitlearn$ ls .git
ls: cannot access .git: No such file or directory
~/gitlearn$ git st
fatal: Not a git repository (or any parent up to mount point /home/gfixler)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
这就是制作 git repo 所需的全部内容:
~/gitlearn$ mkdir -p .git/objects .git/refs
~/gitlearn$ echo 'ref: refs/heads/master' >.git/HEAD
~/gitlearn$ git st
# On branch master
#
# Initial commit
#
~/gitlearn$ tree .git
.git
|-- HEAD
|-- objects
`-- refs
2 directories, 1 file
我会做这样的事情:
~/gitlearn$ echo something >afile
~/gitlearn$ git add afile
~/gitlearn$ git st
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: afile
#
~/gitlearn$ git commit -m'Add something to afile'
[master 3f78112] Add something to afile
1 file changed, 1 insertion(+)
create mode 100644 afile
~/gitlearn$ echo another thing >>afile
~/gitlearn$ git diff
diff --git a/afile b/afile
index deba01f..fa8eba8 100644
--- a/afile
+++ b/afile
@@ -1 +1,2 @@
something
+another thing
~/gitlearn$ git add --update .
~/gitlearn$ git commit -m'Add another thing to afile'
[master 5c639d9] Add another thing to afile
1 file changed, 1 insertion(+)
~/gitlearn$ git checkout -b feature
Switched to a new branch 'feature'
~/gitlearn$ echo >>afile
~/gitlearn$ echo feature 1 >>afile
~/gitlearn$ git diff
diff --git a/afile b/afile
index fa8eba8..be87597 100644
--- a/afile
+++ b/afile
@@ -1,2 +1,4 @@
something
another thing
+
+feature 1
~/gitlearn$ git add --update .
~/gitlearn$ git ci -m'Add feature 1 to afile'
[feature 25b20ab] Add feature 1 to afile
1 file changed, 2 insertions(+)
~/gitlearn$ git log --all --graph --decorate --oneline
* 25b20ab (HEAD, feature) Add feature 1 to afile
* 5c639d9 (master) Add another thing to afile
* 3f78112 Add something to afile
* 70e28a0 Add empty, initial commit
~/gitlearn$
等等......直到我理解一个概念。这是一种快速的实验方式。我也使用了许多别名,这样可以加快速度,例如,git add --update .
我只需键入git add --u<TAB> .
,因此大多数命令往往少于 15 次按键。
我现在已经向几个人推荐了这个。这是一个非常好的方法,可以让我自己快速适应基础知识,以及最近更深入的 git 内部结构。
至于遥控器,我一直在本地模仿。mkdir remote.git; cd remote.git; git init --bare; cd ..; git clone remote.git local; cd local
现在您位于“本地”存储库中,该存储库将“remote.git”中的存储库视为其来源。这里与典型设置没有区别,只是裸露的“remote.git”实际上在您的本地磁盘上。在“本地”中,您可以向“remote.git”推送、获取和拉取,它在功能上与您在本地和物理远程仓库之间执行的操作相同。