一个新的 git 学习课程(3)仓库
Git 初使用之仓库
(如果文章确实地帮助你解决了问题,请点个推荐,让我开心一下,助人为乐,嘿嘿(▽))
这是我按一个学习课程走的 Git
命令,我全部列出,用作复习所用。
使用远程仓库
远程仓库
# git remote 命令可以让你管理远程仓库和与之交互
git remote
需要注意的是在你克隆仓库后的情况。如果你克隆了,那么你将自动获得一个远程仓库,因为它是从你所提供的 URL 上的仓库克隆来的。
git remote -v
# 或者
git remote --verbose
添加远程仓库
git remote add origin https://github.com/richardkalehoff/RichardsFantasticProject.git
# origin 只是自定义的一个名称
$ git remote add repo-on-GitHub https://github.com/richardkalehoff/RichardsFantasticProject.git
git clone https://github.com/owen/my-travel-plans.git
将更改推送到远程仓库
# git push <remote-shortname> <branch>
git push origin master
git push
会同步远程仓库与本地仓库。要执行相反操作(将本地仓库与远程仓库同步),我们需要使用git pull
。git pull
的格式与git push
的非常相似-
提供远程仓库的简写名,以及你要拉取 commit 的分支名称。
将远程仓库拉取修改
# 运行 git pull origin master 会检索 origin 远程仓库 master 分支中的 commit 。
git pull origin master
在运行git pull
时,会发生以下活动:
- 远程分支上的 commit 会被复制到本地仓库
- 本地跟踪分支(
origin/master
)移到指向最新的 commit - 本地跟踪分支(
origin/master
)合并到本地分支(master
)
如果你不想自动将本地分支与跟踪分支合并,则不应使用git pull
,而是使用另一个命令git fetch
。当远程仓库包含你没有的 commit ,但本地仓库也包含远程仓库所没有的 commit 时,你可能想这么做。
Pull 与 Fetch
git fetch origin master
运行git fetch
后,会发生以下活动:
- 远程分支上的 commit 会复制到本地仓库
- 本地跟踪分支(例如,
origin/master
)移到指向最新的 commit ,需要注意的一点是,本地分支完全不会被改变。
你可以将git fetch
想象成git pull
它的一半操作,而git pull
的另一半是合并。
使用git fetch
而不是git pull
的一个主要情形是当你的远程分支和本地分支都拥有对方所没有的更改时。在这种情况下,你要获取远程更改,将它们存储到本地分支中,然后手动执行合并。最后,你可以将新的合并 commit 推送会远程仓库。
使用其他开发者的仓库
fork 仓库
查看现有工作
# 要看到每位贡献者在此仓库中添加了多少 commit
git shortlog
git shortlog
显示了按字母顺序排序的人名列表,以及他们对应的提交说明。如果我们只想看到每个开发者的 commit 数量,我们可以添加几个选项:用-s
仅显示 commit 的数量(而不是每个 commit 的消息),以及用-n
来按数量排序(而不是按作者姓名的字母顺序)。
git shortlog -s -n
# 按作者筛选
git log --author=Surma
# Paul Irish 和 Paul Lewis 的 commit 都有
git log --author=Paul
# 如果我们只想看到 Paul Lewis 的 commit ,我们需要运行:
git log --author="Paul Lewis"
# 按搜索内容筛选 commit
git log --grep=bug
# 或者
git log --grep bug
# 包含空格搜索
git log --grep="unit tests"
Grep 是一个模式匹配工具,它不在本课程教学范围内。但是简单介绍一下,如果你运行git log --grep "fort"
,那么 Git 将显示顺序包含字符f
、o
、r
、t
的 commit 。
确定你的任务
小结
在开始任何工作之前,确保阅读项目的 CONTRIBUTING.md 文件。
接下来,查看项目的 GitHub 问题
- 查看现有的问题,看是否有哪些内容类似于你想贡献的更改
- 如有必要,创建一个新的 Issue
- 与项目维护者交流你想要做出的更改
当开始开发后,将所有工作 commit 到特性分支上:
- 不要在主分支上工作
- 确保给特性分支赋予一个清晰、描述性的名称
以及编写 commit 的一般最佳实践
- 频繁少量 commit
- 使用清晰、具有描述性的提交说明
- 必要情况下,更新 README 文件
与远程仓库保持同步
创建 Pull Request
与源项目保持同步
管理活跃 PR
压制 commit
git rebase -i HEAD~3
git rebase
命令会将 commit 移动到一个新基底(base)上。在命令git rebase -i HEAD~3
中,我们告诉 Git 使用HEAD~3
作为其他所有 commit (HEAD~2
、HEAD~1
和HEAD
)将连接到的基底。
命令中的-i
代表"交互式"。你可以在非交互模式下执行 rebase。在你学习如何 rebase 时,我明确建议你进行交互式 rebase。
rebase 命令:
来看看你可以使用git rebase
执行哪些不同的命令:
使用 p 或 pick – 使 commit 保持原样
使用 r 或 reword – 保留 commit 的内容,但修改 commit 说明
使用 e 或 edit – 保留 commit 的内容,但先不要执行 commit,以便:
添加新内容或文件
删除内容或文件
修改即将 commit 的内容
使用 s 或 squash – 将此 commit 的更改结合到之前的 commit 中(列表中位于其上面的 commit )
使用 f 或 fixup – 将此 commit 的更改结合到前一个 commit 中,但删除提交说明
使用 x 或 exec – 运行 shell 命令
使用 d 或 drop – 删除 commit
新的尝试
学到这对 git 的基本使用有了一些了解,我在尝试能不能在自己的U盘上搭建一个移动的 git 仓库呢?因为 github 免费的仓库默认是开源的。