一个新的 git 学习课程(2)Git 初使用
Git 初使用
这是我按一个学习课程走的 Git
命令,弄懂这些命令也就代表了对 Git
的使用有了基本了解,所以我全部列出,用作复习所用。
什么是版本控制
# 设置你的 Git 用户名
git config --global user.name "your-name"
# 设置你的 Git 邮箱
git config global user.email "your-email"
# 确保 Git 输出内容带有颜色标记
git config global color.ui auto
# 对比显示原始状态
git config --global merge.conflictstyle diff3
git config --list
创建 Git 仓库
ls
mkdir
cd xxx
rm xxx
git init
git clone https://github.com/udacity/course-git-blog-project
git clone https://github.com/udacity/course-git-blog-project blog-project
cd course-git-blog-project/
git status
git log
# 先输入
git log
# 然后试一下以下这些按键
-
要向下滚动,按下
-
j
或↓
一次向下移动一行 -
d
按照一半的屏幕幅面移动 -
f
按照整个屏幕幅面移动 -
要向上滚动,按上
-
k
或↑
一次向上移动一行 -
u
按照一半的屏幕幅面移动 -
b
按照整个屏幕幅面移动 -
按下
q
可以退出日志(返回普通的命令提示符)
git log f9720a
git log --oneline
git log --stat
git log --stat f9720a
git log -p
# 或者
git log --patch
# 我不推荐使用简称,如果可以使用全称,则使用全称
git log --patch --stat
git log --patch -w
git log --patch f9720a
git show
git show f9720a
向仓库中添加 commit
git add index.html
git rm --cached
git add css/app.css js/app.js
git add .
git commit
# 如果你没有修改 Git 的编辑器,那么这里涉及有一些 vim 编辑器的操作。
# 以 # 开头的是行注释,将不会被记录。
git commit -m "Initial commit"
git diff
# .gitignore 文件里的文件将被忽略添加
通配符允许你使用特殊的字符来表示某些格式/字符。在 .gitignore
文件中,你可以使用:
- 空白行作为空格
#
- 将行标记为注释*
- 与 0 个或多个字符匹配?
- 与 1 个字符匹配[abc]
- 与 a、b 或 c 匹配**
- 与嵌套目录匹配 -a/**/z
与以下项匹配- a/z
- a/b/z
- a/b/c/z
因此如果所有 50 个图片都是 JPEG 图片,并且位于"samples"文件夹中,那么我们可以向.gitignore
中添加以下行,使 git 忽略所有这 50 个图片。
samples/*.jpg
标签、分支和合并
git tag -a v1.0
# 或
git tag --annotate v1.0
git log --decorate
git tag -d v1.0
# 或
git tag --delete v1.0
git tag --annotate v1.0 a879984
git branch
git branch sidebar
git checkout sidebar
git branch alt-sidebar-loc 42a69f
git branch -d sidebar
# 或
git branch --delete sidebar
git checkout -b richards-branch-for-awesome-cheanges
git checkout -b footer master
git log --oneline --graph --all
git merge footer
git merge sidebar
合并冲突指示符解释
编辑器具有以下合并冲突指示符:
<<<<<<< HEAD
此行下方的所有内容(直到下个指示符)显示了当前分支上的行||||||| merged common ancestors
此行下方的所有内容(直到下个指示符)显示了原始行的内容=======
表示原始行内容的结束位置,之后的所有行(直到下个指示符)是被合并的当前分支上的行的内容>>>>>>>
heading-update 是要被合并的分支(此例中是 heading-update 分支)上的行结束指示符
解决合并冲突
git 使用合并冲突指示符来告诉你两个不同分支上的哪些行导致了合并冲突,以及原始行是什么。要解决合并冲突,你需要:
- 找到并删掉存在合并冲突指示符的所有行
- 决定保留哪些行
- 保存文件
- 暂存文件
- 提交 commit
撤销更改
git commit --amend
git revert db7e87e
重置很危险
我们可以使用特殊的“祖先引用”字符来告诉 git 这些相对引用。这些字符为:
^
– 表示父 commit~
– 表示第一个父 commit
我们可以通过以下方式引用之前的 commit:
- 父 commit – 以下内容表示当前 commit 的父 commit
- HEAD^
- HEAD~
- HEAD~1
- 祖父 commit – 以下内容表示当前 commit 的祖父 commit
- HEAD^^
- HEAD~2
- 曾祖父 commit – 以下内容表示当前 commit 的曾祖父 commit
- HEAD^^^
- HEAD~3
^
和 ~
的区别主要体现在通过合并而创建的 commit 中。合并 commit 具有两个父级。对于合并 commit,^
引用用来表示第一个父 commit,而 ^2
表示第二个父 commit。第一个父 commit 是当你运行 git merge
时所处的分支,而第二个父 commit 是被合并的分支。
我们来看一个示例,这样更好理解。这是我的 git log 当前的显示结果:
* 9ec05ca (HEAD -> master) Revert "Set page heading to "Quests & Crusades""
* db7e87a Set page heading to "Quests & Crusades"
* 796ddb0 Merge branch 'heading-update'
|\
| * 4c9749e (heading-update) Set page heading to "Crusade"
* | 0c5975a Set page heading to "Quest"
|/
* 1a56a81 Merge branch 'sidebar'
|\
| * f69811c (sidebar) Update sidebar with favorite movie
| * e6c65a6 Add new sidebar content
* | e014d91 (footer) Add links to social media
* | 209752a Improve site heading for SEO
* | 3772ab1 Set background color for page
|/
* 5bfe5e7 Add starting HTML structure
* 6fa5f34 Add .gitignore file
* a879849 Add header to blog
* 94de470 Initial commit
我们来看看如何引用一些之前的 commit。因为 HEAD
指向 9ec05ca
commit:
- HEAD^ 是
db7e87a
commit - HEAD~1 同样是
db7e87a
commit - HEAD^^ 是
796ddb0
commit - HEAD~2 同样是
796ddb0
commit - HEAD^^^ 是
0c5975a
commit - HEAD~3 同样是
0c5975a
commit - HEAD^^^2 是
4c9749e
commit(这是曾祖父的 (HEAD^^
) 第二个父 commit (^2
))
# 这句话可以用来删除前备份一个分支
git branch backup
git reset --mixed HEAD^
# reset 有三个参数选项: mixed , soft , hard