闲来无事,发现一篇对Git不了解的人非常好的文章,译之
原文网址
https://try.github.io/levels/1/challenges/1
英文水平不咋地,有翻译不到位请指出。同时,本人也是Git的初学者,理解不到位的地方也请指出。另外,还是建议仔细阅读英文原文。
Git是一个免费开源的分布式(distributed)版本控制系统,他被设计来处理所有从小到大的项目。Git易学有非常高速的性能。
1.1 有15分钟想学习Git?
Git允许一批人同时修改一份文件(通常是code),而需要等他人执行完毕才能继续操作。是一个版本控制系统。
我们的终端已经打开处于一个我们想要命名为octobox的目录,为了在这里初始化一个Git版本库,打印以下命令:
git init
Initialized empty Git repository in /.git/
Success!
tips:
Directory:
储存多个文件的文件夹.
Repository:
一个目录在这里Git被初始化并开始对你的文件进行版本控制
Clicky Click:
点击文字链接. 他们会被复制到终端显示.
tips:此时你会看到一个.git的目录,这通常是隐藏的但是为了方便,我们展示给你看。如果你点击他,你会发现他里面有各种文件和目录,你很少需要对这里的文件做什么,但是这个就是Git的核心,也是奇迹发生的地方。
1.2检查状态
干得漂亮,正如git告诉我们,我们的“octobox”目录现在已经是一个git的空库,当你在阅读这个手册,为了加快你的进程,并且为了让你快速成功的建立一个免费的学校代码账户(阴沟里洗水平有点不够了),我们在这里等你。下一步,输入git status命令查看当前我们的项目状态。
$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
Success!
tips:经常打git status 是很好的,有时一些事情会有所不同,只是你么有发现。
1.3 增加&提交
我在octobox库里为你创建了一个叫做octocat.txt的文件(正如你从浏览器中看到的一样),你可以再次输入git status查看版本库的状态发生了何种变化
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# octocat.txt
nothing added to commit but untracked files present (use "git add" to track)
Success!
tips:
staged:
本地文件已经准备好提交
unstaged:
本地文件有一些修改,还没准备好提交
untracked:
本地文件还没有被git跟踪,这通常是表示一个新创建的文件
deleted:
本地文件已经被删除并且正准备从git删除
1.4 增加修改
好,看起来我们的Git库运行正常。发现Git说octocat.text是“untracked”了吗,这个说明Git发现octobox.txt是一个新文件。为了告诉git让他跟踪octocat.txt的变化,我们首先需要把文件加到工作区域,通过使用git add
$ git add octocat.txt
Nice job, you've added octocat.txt to the Staging Area
$
tips:
add all:
你也可以输入 git add -A . 点的位置代表当前目录,那么所有当前目录,以及目录以下的文件都被add了,-A 甚至删除文件的操作也能包括在其中。
git reset:
你可以使用git reset 来删除“staging area”中的一个或者多个文件
1.5 检查变化
Git现在正在追踪我们的octocat.txt,让我们输入git status再看下我们现在处于什么位置
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: octocat.txt
#
Success!
tips:
Staging Area:
在我们把文件们“commit”之前,可以把这些文件都放在一起的一个地方
Commit:
一个 “commit”是我们版本库的一个缩写,这样的话,如果我们需要回顾我们所做的修改(或者其他人做的修改),我们能清晰地看到一个所有修改的时间线
1.6 提交
发现Git是如何解释“ changes to be committed”了吗?现在文件的列表现在处于“Staging Area”,他们现在还不在我们的版本库。我们在我们把这些文件储存进我们的版本库之前,我们可以从stage把这些文件 add或者删除
为了保存我们的修改,我们允许commit命令,并且附带一个信息来描述我们做了什么修改。让我们输入如下命令:
$ git commit -m "Add cute octocat story"
[master (root-commit) 20b5ccd] Add cute octocat story
1 file changed, 1 insertion(+)
create mode 100644 octocat.txt
Success!
$
tips:
Wildcards:(通配符)
我们需要使用引号,这样Git会在我们的shell阻碍之前,接收通配符。没有引号,我们的shell只会在当前目录执行通配符搜索。Git将会接收shell发现的文件列表而不是通配符并且不会将文件添加替换到octofamily目录(翻译有误? 实际网页执行git commit -m Add cute octocat story 也是同样的效果,ps后来在ubantu下发现,不加‘’只会对当前文件夹下的文件有操作,而不会对子文件夹下的文件操作,添加‘’后会递归操作)
1.7 add 所有修改
好!如果你想add许多相同类型的文件你也可以使用通配符。发现我已经add了一堆.txt的文件到你的目录下面了吗。我放了一些这样的文件在“octofamily”目录,其他的放在“octobox”目录,幸运的是,我们可以使用通配符add所有的新文件,不要忘记引号。
$ git add '*.txt'
Success!
tips:
检查所有东西
当使用通配符时,你提交时应该格外小心,当你正真提交时,通过git status确保检查什么文件和文件夹处于staged状态。这样你可以确定你正在提交你想要提交的东西。
1.8 提交所有修改
好了,你已经添加了所有txt文件到了staging area。随时输入git status来看看你将要提交的东西。如果看起来没有问题,继续输入如下命令:
$ git commit -m 'Add all the octocat tet file'
[master bcb0539] Add all the octocat tet file
4 files changed, 4 insertions(+)
create mode 100644 blue_octocat.txt
create mode 100644 octofamily/baby_octocat.txt
create mode 100644 octofamily/momma_octocat.txt
create mode 100644 red_octocat.txt
Success!
$
tips:
更多有用的log:
使用git log –summary 来查看每次提交的更多的信息。你可以看到新的文件第一次被加到哪边或者那边的文件被删除了。这是一个很好的观察这个项目的进程的方法。
1.9 历史
我们已经有了一些提交,现在让我们看一下我们已经做了什么修改。
幸运的是,这里有git log,把git的log想象成日志,记录所有我们一直以来进行的提交,而且按照提交顺序记录,尝试输入以下命令:
$ git log
commit 3852b4db1634463d0bb4d267edb7b3f9cd02ace1
Author: Try Git <try_git@github.com>
Date: Sat Oct 10 08:30:00 2020 -0500
Add all the octocat txt files
commit b652edfd888cd3d5e7fcb857d0dabc5a0fcb5e28
Author: Try Git <try_git@github.com>
Date: Sat Oct 10 08:30:00 2020 -0500
Added cute octocat story
Success!
tips
git remote:
Git不介意你的远程分支叫什么,但是命名你的主分支为origin却是经典的。把你的主仓库放到远程服务器(例如GitHub),万一你的机器在一次横跨大西洋的旅行中掉进海里了或者在地震中被几只猴子雕像给砸坏了,在此种情况下,放到远程服务器也许是一个好方法
1.10
很好,我们将要继续使用Try Git为你在https://github.com/try-git/try_git.git创建一个新的空的GitHub版本库。为了push我们本地的repo到GitHub服务器,我们将需要新加一个远程版本库。
这个命令需要一个远程名称和一个版本库URL(在我们现在的情况下是https://github.com/try-git/try_git.git.)
继续运行使用以下参数git remote add:
Go ahead and run git remote add with the options below:
$ git remote add origin https://github.com/try-git/try_git.git
success
tips:
非常好的东西:
当你开始掌握git的使用窍门时你可以做一些非常有趣的事(with hooks?没理解。。)当你push时。举个例子,无论何时你push到你的远程主分支,可以直接上传到web服务器而不是必须使用ftp客户端上传到你的网站。更多详情请查看Customizing Git - Git Hooks(意思应该是百度或者Google一把)
1.11 Push到远程
push命令高速Git当我们准备好时我们的提交将要放在哪里。so,让我们push 我们的修改到我们的origin repo(在GitHub上)
我们的远程分支名叫origin,并且默认的本地分支的名字是master。-u 告诉Git记住参数,那样下次我们可以简单地运行git push而Git将会知道要做什么。继续push文件吧!
$ git push -u origin master
Branch master set up to track remote branch master from origin.
Success!
$
tips:
git stash:
有时当你将要pull的文件也许有你不想提交的修改。一个方法是,与其提交,不如储存这些修改。使用命令: git stash 来储存你的修改,在你pull之后使用git stash apply来恢复的修改(实际开发里本人使用的是git stash pop,apply 只会读取暂存区的数据,通过apply后,暂存区的数据仍然存在;而pop是取出最新的一次暂存数据,取出后,这次数据就不会存在于暂存区中了。摘自百度)
1.12 从远程pull
让我们假装现在已经过去了一段时间。我们邀请了其他人到我们的GitHub项目,他们已经拉下你的修改,他们自己也做了提交,并且push了。我们可以检查看看我们的GitHub仓库的修改,并拉下所有新的修改并且运行。
$ git pull origin master
Updating 3852b4d..3e70b0f
Fast-forward
yellow_octocat.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 yellow_octocat.txt
Success!
$
tips:
HEAD:
Head是一个指针,它控制你的所有不同提交的位置。默认的HEAD指向你最近一次的提交,所以他可以被用来作为一个快速地方法来指向那次提交而不必查询SHA值(在Git中,每个commit ID的信息(如cc127537978af35e2f502da7e8d22e340ed810e5)就是一个SHA-1 Hash值,它是对那个commit是Git仓库中内容和头信息(Header)的一个校验和(checksum)–摘自http://smilejay.com/2012/08/git-commit-sha-1/)
1.13 不同
恩,看起来octocat家庭有一些补充和修改了,让我们通过git diff命令查看一下从我们最后一次的提交之后又发生了什么变化。在这种情况下,我们希望看到我们最新一次提交的区别,我们可以依赖HEAD指针。
$ git diff HEAD
diff --git a/octocat.txt b/octocat.txt
index 7d8d808..e725ef6 100644
--- a/octocat.txt
+++ b/octocat.txt
@@ -1 +1 @@
-A Tale of Two Octocats
+[mA Tale of Two Octocats and an Octodog
Success!
$
tips:
Commit 的规则
你想尽力在不同的提交之间保持相关的变化。使用git diff将会给你一个很好的你所有修改的总览,并让你一次add一个文件或者目录并且单独的提交他们。
1.14 Staged Differences(不同 分段?)
另外一个diff的很好的用法是查询已经被staged的文件的不同。记住,staged文件就是我们已经告诉git已经准备好提交的文件。
让我们式样git add 来stage octofamily/octodog.txt 这个我已经为你add好了。
$ git add octofamily/octodog.txt
Success!
$
1.15 Staged Differences (cont’d)
好,现在继续运行git diff使用–staged参数来看看你刚刚staged的修改。你应该看到octodog.txt被创建了
$ git diff --staged
diff --git a/octofamily/octodog.txt b/octofamily/octodog.txt
new file mode 100644
index 0000000..cfbc74a
--- /dev/null
+++ b/octofamily/octodog.txt
@@ -0,0 +1 @@
+[mwoof
Success!
$
1.16 Resetting the Stage
既然现在octodog是family的一部分,octocat就沮丧了。因为我们更喜欢octocat,我们将octodog删除以舒展octocat的眉毛。你可以通过使用git reset命令来unstage文件。继续删除octofamily/octodog.txt
git reset octofamily/octodog.txt
Success!
$
tips:
The ‘–’
所以你可能会想,为什么我要使用这个“–”这玩意?即使没有他git貌似也能很好的工作。他只是简单的告诉命令行在‘–’之后没有更多的参数。这种情况下,如果你碰巧有个叫octocat.txt的分支,它仍然会恢复文件,而不是切换到具有相同名称的分支。
1.17 Undo
git reset在unstaging octodog.txt的工作上做得很好,但是你会发现,它仍然在那里。它只是不再处于staged状态。如果我们可以回退到octodog出现破坏美好的聚会之前,将是极好的。文件可以被修改回退到他们最新一次提交之前的样子,需使用如下命令:git checkout –。继续废弃最新一次octocat.txt的所有修改
> git checkout --octocat.txt(实际测试时没有成功)
Success!
$
tips:
Branching
当你想要多方面同时工作,分支自然会产生。You wouldn’t want to end up with a master branch which has Feature A half done and Feature B half done.Rather you’d separate the code base into two “snapshots” (branches) and work on and commit to them separately.(没大看懂。。) 只要一人准备好提交了, 你应该把这个分支合并到master分支并将它push到远程服务器。
1.18 Branching Out
当开发者开发一个功能或者bug时通常他们都会创建一个他们代码的拷贝(aka. brach)以便于他们可以单独提交。然后当他们完成工作时他们可以将这个分支合并到主分支。我们想清除所有这些讨厌的octocats,让我们创建一个分支叫clean_ip,在这里我们处理所有工作。
$ git branch clean_up
Success!
$
1.19 Switching Branches
好! 现在如果你打印git branch你会看到两个本地分支:一个主分支叫做master,一个是你新创建的clean_up的分支。你可以切换分支:使用git checkout 命令。现在试试切换到clean_up分支。
git checkout clean_up
$ git checkout clean_up
Switched to branch 'clean_up'
Success!
$
All at Once
你可以使用:
git checkout -b new_branch 来同时checkout和创建一个新分支。这样与以下做法是一样的:
git branch new_branch
git checkout new_branch
1.20 Removing All The Things
好, 现在你已经在clean_up分支了。你终于可以用git的命令git rm来删除所有这些讨厌的octocats,这不仅会从本地磁盘删除实际文件,也会删除stage状态的文件(不确定翻译正确不?)你将再次使用一个通配符来让所有的octocat文件在一个范围,继续执行git rm ‘*.txt’
$ git rm '*.txt'
rm 'blue_octocat.txt'
rm 'octocat.txt'
rm 'octofamily/baby_octocat.txt'
rm 'octofamily/momma_octocat.txt'
rm 'red_octocat.txt'
Success!
$
tips:
Remove all the things!
删除一个文件是没有问题的,但是如果你要删除整个文件呢?你可以使用递归参数在git rm之后:git rm -r folder_of_cats,这将会递归地删除所有给出目录下的文件夹和文件。
1.21 Commiting Branch Changes
既然你已经删除所有的cats,你需要提交你的修改。运行git status检查你即将提交的更改。
git commit -m “Remove all the cats”
$ git commit -m "Remove all the cats"
[clean_up 63540fe] Remove all the cats
5 files changed, 5 deletions(-)
delete mode 100644 blue_octocat.txt
delete mode 100644 octocat.txt
delete mode 100644 octofamily/baby_octocat.txt
delete mode 100644 octofamily/momma_octocat.txt
delete mode 100644 red_octocat.txt
Success!
$
tips:
The ‘-a’ option
如果你碰巧需要删除一个文件没有使用‘git rm’,你将会发现你仍然需要从工作tree‘git rm’这个已经删除的文件。你可以通过使用‘-a’参数添加到‘git commit’来保存这一步,这会在提交时自动移除删除的文件。命令大致如下:
git commit -am “Delete stuff”
1.22 Switching Back to master
好,你几乎处理完cat,额。。不是是bug的修正了,你只需要切换回主分支,这样你可以从CLEAN_UP分支复制(或合并)你的更改到主分支。继续并checkout master分支:
git checkout master
$ git checkout master
Switched to branch 'master'
Success!
$
Pull Requests
如果你在GitHub托管了你的repo,你可以做一些叫做pull请求的操作。一个pull请求允许项目的老板来浏览你们的修改,并可以在决定合并修改前做出评论。这是个非常好的功能,远程工作者和开源项目都会使用。查询pull请求的帮助页可以获得更多信息。
1.23 Preparing to Merge
好了,从clean_up分支合并你的修改的到master分支的时刻已经到来,深呼吸,这并不是那么可怕。我们已经在master分支,因此我们只需要高速Git去合并clean_up分支进去:
git merge clean_up
$ git merge clean_up
Updating 3852b4d..ec6888b
Fast-forward
blue_octocat.txt | 1 -
octocat.txt | 1 -
octofamily/baby_octocat.txt | 1 -
octofamily/momma_octocat.txt | 1 -
red_octocat.txt | 1 -
5 files changed, 5 deletions(-)
delete mode 100644 blue_octocat.txt
delete mode 100644 octocat.txt
delete mode 100644 octofamily/baby_octocat.txt
delete mode 100644 octofamily/momma_octocat.txt
delete mode 100644 red_octocat.txt
Success!
$
Merge Conflicts
合并冲突会在同一份文件同时修改时发生。许多人当冲突发生时都很害怕,但无需害怕!他们并不是那么可怕,你只需决定哪部分代码需要保留。合并冲突超出了本课程的范围,但如果你有兴趣阅读更多,看看Pro Git一书冲突是如何呈现的那一章节。
1.24 Keeping Things Clean
恭喜!你刚刚完成了你第一次成功的bug修改和合并。现在剩下的就是清理干净了。因为你已经处理完clean_up分支了,你不再需要他了。你可以使用git branch -d <分支名>来删除分支。现在继续删除clea_up分支:
git branch -d clean_up
$ git branch -d clean_up
Deleted branch clean_up (was ec6888b).
Success!
$
Advice
Force delete
如果你已经在一个功能的分支上而你决定你不在需要这个功能怎么办呢?你也许决定删除这个分支自从你想要废弃这个功能。你会发现git branch -d bad_feature不管用。这是因为-d不会让你删除一些还没有合并的东西。你可以在一个命令添加–force(-f)参数或者使用-D合起来就是-d -f.
1.25 The Final Push
这里是最后一步了,我很自豪你已经走到这么远,很高兴跟你一起学习Git。现在剩下的就是push所有你一直在处理的东西到远程仓库,你就大功告成了!
git push
$ git push
To https://github.com/try-git/try_git.git
3e70b0f..e02c257 master -> master
Success!
Learning more about Git
在此课程中我们只触及的Git的表面。这里还有更多你可以处理的东西。查阅Git文档能看到git功能的完整列表。
由Scott Chacon 编写的Pro Git的书是一个极好的资源,他会教你Git的内在工作方式。
help.github和GitHub的训练也非常适合一般任何和Git相关的东西,在GitHub使用Git也是有帮助的(翻译的有误?)
好!现在你已经尝到Git好处的一点甜头了。你可以看下打包的page以得到更多的一点Git和GitHub的信息,当然,也看看你的勋章!