-3

I like to practice Git in my local computer, what's the best way to do so. I thought of creating two windows user accounts, two repositories(one for each user), and mimic remote repository - all in my local computer.

I don't have a local network, but I do have access to internet. I am particularly interested in resolving pull conflicts, working in multiple branches, etc.

Please share your thoughts and experiences on the best way to learn Git.

4

2 回答 2

4

您可以在文件系统上创建第一个存储库(假设您调用它origin)并在其中运行:

git init --bare

然后您可以使用以下命令进行第一次克隆:

git clone origin clone1

还有第二个:

git clone origin clone2

然后,您可以提交、推送和拉入每个克隆进行训练。

于 2013-05-18T09:13:15.757 回答
1

我的.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”推送、获取和拉取,它在功能上与您在本地和物理远程仓库之间执行的操作相同。

于 2013-05-18T11:00:23.557 回答