看git官方教学视频记的笔记。归纳了一些常用命令的解释与使用案例。
commit
- 在项目文件夹中打开git bash
可以查看git仓库代码的更新状态,有文件修改或者添加文件,文件会标红,修改add提交后变成绿色,文件提交到暂存区域。
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
new.txt
nothing added to commit but untracked files present (use "git add" to track)
$ git add new.txt
$ git commit -m "Just a test" //-m设置提交消息,每次提交都必须有提交消息
可以直接在github的项目代码中进行简单的编辑并设置commit信息。
Diff
- 找出项目中哪些地方被改动了
$ git diff
- 查看暂存区域文件和最近提交的历史文件有什么不同
$ git diff --staged
- 将你的工作树和head commit相比较,即提交历史中的最新提交。
$ git diff HEAD
- 上述diff命令显示修改的整行,以下可以更加详细地标明修改的字母或单词。
$ git diff --color-words
$ git diff --word-diff
- 仅显示更改了的文件,不显示文件的内容。
git diff --stat
Log
- 查看历史提交
$ git log
commit fd40c22127be397f864e77aa0ced9ab101bb6201 (HEAD -> master, origin/master)
Author: susu_xi <xxx@163.com>
Date: Thu Aug 23 16:06:50 2018 +0800
改下文件名
commit fdd512fbe7943535f88c519d4c8192350b655720
Author: susu_xi <xxx@163.com>
Date: Thu Aug 23 15:51:41 2018 +0800
done
- 查看所有历史提交信息概要
$ git log --oneline
fd40c22 (HEAD -> master, origin/master) 改下文件名
fdd512f done
- 查看日志信息与每次提交包含的文件及其增删
$ git log --stat
commit fd40c22127be397f864e77aa0ced9ab101bb6201 (HEAD -> master, origin/master)
Author: susu_xi <xxx@163.com>
Date: Thu Aug 23 16:06:50 2018 +0800
改下文件名
ip monitor/.classpath | Bin 0 -> 232 bytes
ip monitor/.gitignore | 1 +
ip monitor/.project | Bin 0 -> 386 bytes
ip monitor/.settings/org.eclipse.jdt.core.prefs | Bin 0 -> 598 bytes
ip monitor/src/ipWatching/Main.java | 59 ++++++++++++++++++++++++
ip monitor/src/ipWatching/packet.java | 56 ++++++++++++++++++++++
6 files changed, 116 insertions(+)
commit fdd512fbe7943535f88c519d4c8192350b655720
Author: susu_xi <xxx@163.com>
Date: Thu Aug 23 15:51:41 2018 +0800
done
"\346\272\220\347\240\201/.classpath" | Bin 0 -> 232 bytes
"\346\272\220\347\240\201/.gitignore" | 1 +
"\346\272\220\347\240\201/.project" | Bin 0 -> 386 bytes
- 显示出具体版本间的不同,如果文件增加了内容会有绿色加号,减少了会有红色减号
$ git log --patch
- 展示每次提交的一行概括,将会使用ASCII码描述全部提交,同时他会提供我们每个分支的标签和我们提交的其他的标志,例如tags(–decorate查看各个分支当前所指的对象)
$ git log --graph --all --decorate --oneline
remove
- 从文件系统中删除文件,并且它会暂存这个文件已经被删除的事实,提交后,该文件的删除记录依然会存在log中。文件被直接删除后依然可以使用这个命令暂存文件删除记录。
$ git rm new.txt
rm 'new.txt'
....
- 暂存当前工作目录下的所有文件的删除
$ git add -u .
- 删除提交历史,不删除文件
$ git rm --cached new.txt
move
$ git mv oldpath newpath
或者
$ mv oldpath newpath
$ git rm oldpath
$ git add newpath
- 如果不想为每个文件移动都提交记录,那么可以在移动后使用以下命令。git自动判断已经发生的文件移动。无论移动的文件是否被修改,git都将它当作移动。
$ git add -A .
- 查看指定文件的全部提交(不包括移动操作)
$ git log --stat -- 文件名
- 查看指定文件的全部提交,包括移动过程
$ git log --stat -M --follow -- 文件名
移动操作提交中有数值记录移动前后文件的相似度,如果相似度大于50%,则git只将其当作一次移动,反之,会将其当作增加与删除。在-M
后添加数字参数可以调节这一阈值
ignore
为了避免文件或者目录提交到目标仓库,只需要在你的工程的根目录下面创建一个 .gitignore 文件
github项目也可以直接添加.gitingore文件
$ touch .gitignore
$ git add .gitignore
$ git commit -m ” Preparing to ignore temporary files ”
$ vim .gitignore
- 编辑gitingnore文件
new.txt
*.log
#使用#进行注释
test/ //忽略整个文件夹
- 不需要查看.gitignore就可以查看忽略的文件
$ git ls-files --others --ignored --exclude-standard
branch
添加新特性,修复bug,又不想影响到原来的版本,就可以创建一个新的分支。
- 创建新的分支(也可以使用checkout)
$ git branch 新分支名
- 删除分支
$ git branch -d 分支名
如果分支没有合并,则-d需携程-D
$ git branch -D 分支名
- 查看所有分支,分支名称左边有 * 号的是当前分支
$ git branch
或者使用git status
也可以查看当前分支。
checkout
- 切换分支,使HEAD指向新的分支。
即切换当前工作的分支。所有的提交操作在当前工作分支上进行。
$ git checkout 分支名
- 使head指向历史commit版本,进入detached head状态,并可以在该commit上建立新的分支。
$ git checkout commit_id
- 清理掉最后一次commit的内容。
$ git checkout -- 文件名
- 创建新的分支并切换到新分支。
$ git checkout -b new_branch_name
merge
- 合并分支
$ git merge 分支名
- 实例
一般使用master
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
确认该分支有我们想要合并的commit
$ git branch
debugging
*master
合并想要合并的commit
$ git merge debugging
Updating 04c9e0b..4525389
Fast-forward
d2.rb | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
此时master包含两者的综合,包括文件、修改和历史
合并的过程中两个文件的变化十分相似,git不知道如何去解决这些冲突,就是报出冲突信息,并指出冲突文件,待用户解决冲突后再重新提交。
(git status 也可以查看发生冲突的文件)
-
解决冲突
- 打开冲突文件,找到<<<<<<< HEAD。这里指出的是master分支上的文件内容。
- 找到=======。这里指出master分支的文件内容分割。该标记以下为产生冲突的分支内容 。
- 再之后的>>>>>>表示冲突结束的位置。
- 删除以上标记,选择冲突内容中你想要留下的部分,删除另一个。
- 保存文件
- 暂存修改。git add 冲突文件
- 提交修改。git commit 冲突文件
-
遇到冲突不想现在解决或想要丢弃它
$ git merge --abort
- 不想合并两个分支,只合并一个具体分支中的全部commit
$ git merge --squash 目标分支名
合并后可以在最终分支看到所有的操作历史,所以原本的分支标签或者名字就没有用了。
- 清除分支名
$ git branch -d 分支名
network
- 添加远端
$ git remote add 远端名称 url地址
如
$ git remote add origin https://github.com/username/test
- 如果url写错了,可以更改url
$ git remote set-url 远端名 https://....
- 删除远端
$ git remote rm 远端名
- 查看所有远端
$ git remote -v
- 查看有远端追踪的分支
$ git branch -r
- 假设将github上的feature1分支拉取下来,先将github所有关于分支的最新信息更新到远端追踪的
origin/featre1
,然后再将该分支内容与本地合并
$ git checkout feature1
$ git pull orgin
- fetch只是将github所有关于分支的最新信息更新到远端追踪的origin/featre1
$ git fetch origin
- 将本地信息发送到远端,如github。这个过程同样会更新远端追踪的分支origin/featre1
$ git push orgin
fork
fork将别人的项目拷贝过来,并为其新建一个分支。对自己账号下的备份进行修改后,可以通过pull request将变更内容返回给原始开发者
pull request
将一个修改提交到他人的代码仓库中作为提议。
如果有权push
到仓库,也应该在工作分支上发送pull request
来获得代码的review。当你创建了分支,开始提交,并准备好接受别人的review时,就要将pull request
将提交发送给团队中的每一人.
在这里,pull request
不仅仅是一次提交,而是一次对话,他人对你代码的同一或反对以及审核都会展示出来。
github有持续集成系统,成员所在分支的每次合并都会通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误,并与会话一起报告出来。相当于进行了一次预先的合并,并展示给你合并的结果。如果合并成功运行,那么就可以进行merge pull request
reset
reset一共有3种模式:soft,mixed(default),hard
mixed模式会在status中显示。当对暂存区有改动时,查看status,会看到提示
use "git reset HEAD <file>..." to unstage
- 这允许我们将这些该改变移除暂存区,将他们放回工作目录。
$ git reset HEAD
- soft下,当做出一些改动,且改动太过于分散,比如提交了5个commit都属于一个事项,通过下面命令可以将最新的5个提交当作一次提交。
$ git reset --soft HEAD~5
- 想要完全丢弃某些改动
$ git reset --hard HEAD~3
reset是针对整个文件系统历史的改动,checkout则更加关注精确到目录或文件的改动,它可以回到一个特定文件的某次提交的历史上,然后把这个文件和版本拉回到我们目前的工作目录。
reflog
追踪对修改内容的修改。
- 打印出大部分最近的历史
$ git reflog
- 使用打印出的所有历史中的7位hash串,加上reset,可以强制恢复到改历史的状态。
$ git reset --hard e4215cd
- Reflog提供的线性历史可读性低,哪一个是独立的分支?哪一个是不在代码库里一部分的提交。通过gitk可以把reflog的结果通过管道到一个图形用户界面
$ gitk --all ‘ git reflog | cut -c1-7 ’ &
rebase
将已存在的提交,放到今天开始的一个分支上。
当你想为bug修复创建一个新的分支,且向将历史的一些修复一起整合到新的分支上来。
$ git checkout 功能分支
$ git rebase 原来的分支(一般是master分支)
这个操作会检查功能分支上的所有提交,并在主分支上重写,让其仿佛是从最新的时间点开始的
一般持续更新的web应用都是用merge优化而非rebase