用git进行版本控制
主要内容:
- 创建Git仓库
- 查看仓库的历史记录
- 向仓库中添加commit
- 标签、分支和合并
- 撤销更改
在 Windows 上配置命令提示符
固定到快速访问
将文件放在Administor中,再使用gitbash修改文件名https://classroom.udacity.com/courses/ud123/lessons/1b369991-f1ca-4d6a-ba8f-e8318d76322f/concepts/8a5af628-7a18-49cf-bbc8-02691762f862
使用 Git 之前,你需要配置 Git。在命令行工具中运行以下每行,确保所有选项都已被配置好。
#设置你的 Git 用户名 git config --global user.name "<Your-Full-Name>" # 设置你的 Git 邮箱 git config --global user.email "<your-email-address>" # 确保 Git 输出内容带有颜色标记 git config --global color.ui auto # 对比显示原始状态 git config --global merge.conflictstyle diff3 git config --list Git 与代码编辑器 最后一个配置步骤是让 Git 能与你的代码编辑器结合使用。以下是三个最热门的代码编辑器。如果你使用的是其他编辑器,则在 Google 中搜索“修改 Git 默认编辑器为 X 编辑器”(将 X 替换为你的代码编辑器的名称)。 Atom Editor 设置 git config --global core.editor "atom --wait" Sublime Text 设置 git config --global core.editor "C:/Program Files/Sublime Text 2/sublime_text.exe' -n -w" VSCode 设置 git config --global core.editor "code --wait"
Linux命令
mkdir - 用来新建目录 rm - 用来删除文件和目录 pwd 输出当前工作目录
创建Git仓库
仓库初始化:git init #仓库克隆: git clone + 链接 例如:git clone https://github.com/udacity/course-git-blog-project #需要更改项目名字 例如:git clone https://github.com/udacity/course-git-blog-project blog-project 功能: - 会获取现有仓库的路径 - 默认地将创建一个与被克隆的仓库名称相同的目录 - 可以提供第二个参数,作为该目录的名称 - 将在现有工作目录下创建一个新的仓库
实用链接
git status 命令将显示仓库的当前状态。 告诉我们已在工作目录中被创建但 Git 尚未开始跟踪的新文件 Git 正在跟踪的已修改文件
总结
- 用git init创建自己的仓库
- 用git clone复制现有仓库
- 用gitstatus来确定仓库的状态
查看仓库的历史记录
$ git log:显示仓库的commit
显示commit的包括:
SHA
作者
日期
消息
less 的重要快捷键:
要按行向下滚动,使用 j 或 ↓
要按行向上滚动,使用 k 或 ↑
要按页向下滚动,使用空格键或 Page Down 按钮
要按页向下滚动,使用 b 或 Page Up 按钮
要退出,使用 q
按下 q 可以退出日志(返回普通的命令提示符)
$ git log --oneline:
每行显示一个 commit
显示 commit 的 SHA 的前 7 个字符
显示 commit 的消息
git log --stat:
显示被修改的文件
显示添加/删除的行数
显示一个摘要,其中包含修改/删除的总文件数和总行数
git log -p:
? - 正在显示的文件
? - 文件第一版的哈希值和第二版的哈希值
通常不重要,因此可以忽略
❤️ - 文件的旧版本和当前版本
? - 添加的行所在的位置以及添加了多少行
-15,83 表示旧版本(用 - 表示)从第 15 行开始,文件有 83 行
+15,85 表示当前版本(用 + 表示)从第 15 行开始,现在有 85 行...这 85 行显 示在下方
✏️ - 在 commit 中实际进行的更改
用红色标示并以减号 (-) 开头的行是位于文件原始版本中,但是被 commit 删除的 行
用绿色标示并以加号 (+) 开头的行是 commit 新加的行
git log -p -w:
忽略空格更改
git show:
显示一个commit
}
向仓库中添加commit
放到暂存区
快速检查 git 状态:$ git status
暂存文件 $ git add index.html
检查 git 状态:$ git status
不会破坏任何属于你的文件,它只是从暂存区删掉了文件。 git rm --cached
添加更多的文件到暂存区:$ git add css/app.css js/app.js
提交到commit
git commit
在代码编辑器中提供提交说明
以 # 开头的行是注释,将不会被记录
添加提交说明后保存文件
关闭编辑器以进行提交
使用git log检查提交的commit
注:在判断应该在 commit 中包含什么内容时,最好的方法是思考下“如果该 commit 中的 所有更改都清空了,会怎样?”。如果删除了某个 commit,应该只撤消一项更改。
提交说明的书写
建议
消息篇幅简短(少于 60 个字符)
解释提交的作用(不是如何更改或为何更改!)
禁忌
请勿解释为何做出了这些更改(下文会深入讲解这一点)
请勿解释如何进行了更改(这是 git log -p 的目的!)
请勿使用单词"and"如果你必须使用 "and",则你的提交说明可能进行了太多的更改,将这些更改拆分为独立的commit
例如 "make the background color pink and increase the size of the sidebar"
git diff:查看已经执行但是尚未 commit 的更改
和git log用法类似
让git忽略某些文件
通配符速成课程
空白行作为空格
# - 将行标记为注释
* - 与 0 个或多个字符匹配
? - 与 1 个字符匹配
[abc] - 与 a、b 或 c 匹配
** - 与嵌套目录匹配 - a/**/z 与以下项匹配
a/z
a/b/z
a/b/c/z
标签、分支和合并
标签 git tag
$ git tag -a v1.0 添加标签
git tag 显示仓库中的所有标签
git log --decorate 在日志输出中看到标签
$ git tag -d v1.0 删除标签
分支 git branch
# 列出所有分支
$ git branch
#切换分支
$ git checkout sidebar
# 创建新的"footer-fix"分支
$ git branch footer-fix
# 删除"footer-fix"分支
$ git branch -d footer-fix
#--graph 选项将条目和行添加到输出的最左侧。显示了实际的分支。--all 选项会 显示仓库中的所有分支。
$ git log --oneline --decorate --graph --all
合并
$ git merge <other-branch>
合并有以下两种类型:
- 快进合并 要合并的分支必须位于检出分支前面。检出分支的指针将向前移动,指向另一分支所指向的同一 commit。
- 普通类型的合并 两个完全不同的分支被合并创建一个合并 commit
合并冲突
当相同的行在要合并的不同分支上做出了更改时,就会出现合并冲突。git 将>在合并途中暂停,并告诉你存在冲突,以及哪些文件存在冲突。要解决文件中的冲突:
- 找到并删掉存在合并冲突指示符的所有行
- 决定保留哪些行
- 保存文件
- 暂存文件
- 提交 commit
撤销更改
更改最后一个 commit
$ git commit –amend
向 commit 中添加忘记的文件
- 编辑文件
- 保存文件
- 暂存文件
- 运行 git commit –amend
还原commit
git revert 命令用于还原之前创建的 commit
$ git revert <SHA-of-commit-to-revert>
此命令:
- 将撤消目标 commit 所做出的更改
- 创建一个新的 commit 来记录这一更改
重置commit
重置(reset) 似乎和 还原(revert) 相似,但它们实际上差别很大。还原会创建一个新的 commit,并还原或撤消之前的 commit。但是重置会清除 commit!
相关 commit 引用
父 commit – 以下内容表示当前 commit 的父 commit
- HEAD^
- HEAD~
- HEAD~1祖父 commit – 以下内容表示当前 commit 的祖父 - - commit
- HEAD^^
- HEAD~2曾祖父 commit – 以下内容表示当前 commit 的曾祖父 commit
- HEAD^^^
- HEAD~3
==注:HEAD^^^2 是 4c9749e commit(这是曾祖父的 (HEAD^^) 第二个父 commit (^2)) ==
git reset 命令
git reset 命令用来重置(清除)commit
$ git reset <reference-to-commit>
可以用来:
- 将 HEAD 和当前分支指针移到目标 commit
- 清除 commit
- 将 commit 的更改移到暂存区
取消暂存 commit 的更改
表示放在工作目录中
git reset –mixed 或 git reset
例如:
- 9ec05ca (HEAD -> master) Revert “Set page heading to “Quests & Crusades”“
- db7e87a Set page heading to “Quests & Crusades”
- 796ddb0 Merge branch ‘heading-update’
使用上面的仓库
运行 git reset –mixed HEAD^ 会把 commit 9ec05ca 中做出的更改移至>工作目录中。
表示放在暂存区
git reset –soft
运行 git reset –soft HEAD^ 会把 commit 9ec05ca 中做出的更改直接移至暂存区。
放在trash里,回收站,删除
git reset –hard
运行 git reset –hard HEAD^ 将清除 commit 9ec05ca 中做出的更改
? 备份分支 ?
在进行任何重置操作之前,通常需要在最近的 commit 上创建一个 backup 分支,因此如果出现错误,我可以返回这些 commit
git branch backup
github
使用远程仓库
添加远程仓库
- 在本地建立一个简单的项目,并添加内容
- 使用==git init==命令转变为git仓库
- 添加项目
- 使用了==git commit==提交了文件(例如:Initial commit)
- 在github上创建仓库
- 使用==git remote add origin url==本地仓库与GitHub账户上刚创建的远程仓库之间创建连接
- 使用git remote -v 来验证我已经正确添加了远程仓库(==git remote add== 用于添加到新的远程仓库的连接)
将更改推送到远程仓库
- 查看 commit
git log --oneline
推送 commits
$ git push <remote-shortname> <branch>
例如:$ git push origin master
- 检查本地仓库
$ git log --oneline --graph --decorate --all
从远程仓库拉取修改【git fetch获得远程后不合并,git pull 要合并】
当本地仓库和远程仓库都有对方没有的commit使用git fetch
$ git pull origin master
在运行 git pull 时,会发生以下活动:
远程分支上的 commit 会被复制到本地仓库
本地跟踪分支(origin/master)移到指向最新的 commit
本地跟踪分支(origin/master)合并到本地分支(master)
$ git fetch origin master
1. 远程分支上的 commit 会复制到本地仓库
2. 本地跟踪分支(例如,origin/master)移到指向最新的 commit
3. 而且本地分支完全不会被改变
使用其他开发者的仓库
使用fork仓库,在github上点击fork复制别人的仓库
查看现有工作
看到每位贡献者在此仓库中添加了多少 commit,显示了按字母顺序排序的人名列表,以及他们对应的提交说明
$ git shortlog
看每个开发者的 commit 数量,并按数量排名
$ git shortlog -s -n
显示某个作者所有 commit
$ git log --author=Surma
我们想看到 Paul Lewis 的 commit(注意引号)
$ git log --author="Paul Lewis"
按搜索内容筛选 commit
使用 –grep 选项筛选 commit
$ git log --grep=bug $ git log --grep bug[中间有空格]
PULL request
Pull Request的步骤:
- 将他人的仓库Fork成自己的仓库(访问该仓库页>面,点击fork)
- 将自己的仓库clone到本地(git clone 自己仓库的URL)
- 创建特性分支(在GitHub上发送Pull Request时,一般都是发送特性分支。这样一来,Pull Request就拥有了更明确的特性[主题],让对方了解自己修改代码的意图,有助于提高代码的审查效率)
- 做出自己需要的修改
- 提交修改(git add… & git commit -m “…”)
- 创建远程分支(要从GitHub发送Pull Request,GitHub端的仓库中必须有一个包含了修改后代码的分支。git push origin 远程分支名)
- 发送Pull Request(登陆GitHub,切换到相应分支,点击Compare可查看分支之间的差别。点击New Pull Request,在随后显示的表单中填写本次进行Pull Request的理由,并提交即可)
与源项目保持同步
upstream 作为引用源仓库的简写名
$ git remote add upstream https://github.com/udacity/course-collaboration-travel-plans.git
而
git remote add origin url
origin指我们 fork 后的仓库获得上游远程仓库的更改:
$ git pull upstream master
要向 Lam 的仓库推送这些新更改
$ git checkout master # 合并 Lam 的更改 $ git merge upstream/master # 将 Lam 的更改发送到*我的*远程仓库 $ git push origin master
要将源仓库的更改提取到你在 GitHub 上 fork 的仓库副本,你需要:
获得源仓库的可克隆 URL
使用 git remote add 命令创建一个新的远程仓库
使用简写名 upstream 指向源仓库
提供源仓库的 URL
获取新的 upstream 远程仓库
将 upstream 的分支合并到本地分支
将新更新的本地分支推送到你的 origin 仓库
管理活跃PR
压制commit
git rebase
git push -f
强制推送这些 commit
git rebase -i HEAD~3