在今年的 Stack Overflow 开发者调查报告中,超过 70% 的开发者使用 Git,使其成为世界上使用人数最多的版本控制系统。Git 通常用于开源和商业软件开发,对个人、团队和企业都颇有益处。
Q1: 什么是 Git 复刻(fork)?复刻(fork)、分支(branch)和克隆(clone)之间有什么区别?
主题:Git 难度:⭐⭐
Q2: “拉取请求(pull request)”和“分支(branch)”之间有什么区别?
主题:Git 难度:⭐⭐
Q3: “git pull”和“git fetch”之间有什么区别?
主题:Git 难度:⭐⭐
简单来说,git pull 是 git fetch + git merge。
Q4: 如在 Git 恢复先前的提交?
主题:Git 难度:⭐⭐⭐
假设你的情形是这样,其中 C 是你的 HEAD,(F) 是你文件的状态。
(F)
A-B-C
↑
master
要修改提交中的更改:
git reset --hard HEAD~1
现在 B 是 HEAD,因为你使用了 --hard,所以你的文件将重置到提交 B 时的状态。
要撤销提交但保留更改:
git reset HEAD~1
现在我们告诉 Git 将 HEAD 指针移回(后移)一个提交(B),并保留文件原样,然后你可以 git status 来显示你已经检入 C 的更改。
撤销提交但保留文件和索引:
git reset --soft HEAD~1
执行此操作后,git status,你讲看到索引中的文件跟以前一致。
Q5: 什么是“git cherry-pick”?
主题:Git 难度:⭐⭐⭐
命令 git cherry-pick 通常用于把特定提交从存储仓库的一个分支引入到其他分支中。常见的用途是从维护的分支到开发分支进行向前或回滚提交。
这与其他操作(例如:合并(merge)、变基(rebase))形成鲜明对比,后者通常是把许多提交应用到其他分支中。
小结:
git cherry-pick
Q6: 解释 Forking 工作流程的优点
主题:Git 难度:⭐⭐⭐
Forking 工作流程 与其他流行的 Git 工作流程有着根本的区别。它不是用单个服务端仓库充当“中央”代码库,而是为每个开发者提供自己的服务端仓库。Forking 工作流程最常用于公共开源项目中。
Forking 工作流程的主要优点是可以汇集提交贡献,又无需每个开发者提交到一个中央仓库中,从而实现干净的项目历史记录。开发者可以推送(push)代码到自己的服务端仓库,而只有项目维护人员才能直接推送(push)代码到官方仓库中。
当开发者准备发布本地提交时,他们的提交会推送到自己的公共仓库中,而不是官方仓库。然后他们向主仓库提交请求拉取(pull request),这会告知项目维护人员有可以集成的更新。
Q7: 告诉我 Git 中 HEAD、工作树和索引之间的区别?
主题:Git 难度:⭐⭐⭐
Q8: 你能解释下 Gitflow 工作流程吗?
主题:Git 难度:⭐⭐⭐
Gitflow 工作流程使用两个并行的、长期运行的分支来记录项目的历史记录,分别是 master 和 develop 分支。
Q9: 什么时候应使用 “git stash”?
主题:Git 难度:⭐⭐⭐
git stash 命令把你未提交的修改(已暂存(staged)和未暂存的(unstaged))保存以供后续使用,以后就可以从工作副本中进行还原。
回顾:
$ git status
On branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
$ git stash
Saved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage
$ git status
On branch master
nothing to commit, working tree clean
我们可以使用暂存(stash)的一个地方是,如果我们发现在上次提交中忘记了某些内容,并且已经开始在同一分支中处理下一个提交了:
# Assume the latest commit was already done
# start working on the next patch, and discovered I was missing something
# stash away the current mess I made
$ git stash save
# some changes in the working dir
# and now add them to the last commit:
$ git add -u
$ git commit --ammend
# back to work!
$ git stash pop
Q10: 如何从 git 中删除文件,而不将其从文件系统中删除?
主题:Git 难度:⭐⭐⭐⭐
如果你在 git add 过程中误操作,你最终会添加不想提交的文件。但是,git rm 则会把你的文件从你暂存区(索引)和文件系统(工作树)中删除,这可能不是你想要的。
换成 git reset 操作:
git reset filename # or
echo filename >> .gitingore # add it to .gitignore to avoid re-adding it
上面意思是,git reset
Q11: 是么时候使用“git rebase”代替“git merge”?
主题:Git 难度:⭐⭐⭐⭐⭐
这两个命令都是把修改从一个分支集成到另一个分支上,它们只是以非常不同的方式进行。
考虑一下场景,在合并和变基前:
A <- B <- C [master]
^
\
D <- E [branch]
在 git merge master 之后:
A <- B <- C
^ ^
\ \
D <- E <- F
在 git rebase master 之后:
A <- B <- C <- D <- E
使用变基时,意味着使用另一个分支作为集成修改的新基础。
何时使用:
更多需要考虑的因素: