git游戏通关流程

init 初始化

1
git init git_hug

config 配置

1
git config --local user.name xxxx
1
git config --local user.email xxxx.qq.com

add 添加

1
git add README

commit 提交

1
git commit -m "add README"

clone 克隆

1
git clone https://github.com/Gazler/cloneme

clone to folder 克隆到文件夹

1
git clone https://github.com/Gazler/cloneme my_cloned_repo

ignore 忽略

1
notepad .gitignore

*.swp

include 包含

*.a
!lib.a

status 状态

1
git status

Number of files committed

changes to be committed
暂存状态
changes not staged for committed
修改未暂存状态
untracked files
未跟踪状态

rm 从仓库删除文件

1
git add deleteme.rb
1
git commit -m "remove deleteme.rb"

rm_cached 仅从stagin area中移除

1
git rm --cached deleteme.rb

stash 临时提交

1
git stash

rename 重命名

1
git mv oldfile.txt newfile.txt

需要文件是已跟踪状态才可以使用

restructure 移动所有文件到文件夹

1
git mv *.html src

需要在git bash下执行,win cmd下只能rename单个文件

log 记录

1
git log
1
git log --oneline --graph

git log -1 –pretty=raw,可以查看commit之间的父子关系,如下图所示,需要注意的是最开始的commit是没有父提交的。

tag 为提交打标签

1
git tag new_tag

push tags 推送标签到远端

1
git push --tags origin master

commit amend 提交中补上文件

1
git add forgotten_file.rb
1
git commit --amend

会进入编辑界面修改备注信息,:wq保存退出

commit in feature 指定一个时间

1
git commit --date=10.12.2016T17:17:00

在vim中编辑,添加add README,:wq保存退出

reset 取消已经暂存的文件

1
git reset
1
git add to_commit_first.rb


1
git reset HEAD to_commit_second.rb

1
git commit -m add to_commit_first.rb
  • git reset 用仓库的版本覆盖staging area中的,如果working directory该文件没有修改,则staging area中的修改应用到working directory中。反之working drietoty中的版本保留,丢弃staging area中的修改。
  • git checkout则是使用staging area中的版本覆盖working directory。

rest soft 撤销上一次提交

  • –soft 参数将上一次的修改放入staging area
  • –mixed 参数将上一次的修改放入working directory
  • –hard 参数直接将上一次的修改抛弃
    HEAD 最近一个提交
    HEAD^ 上一次提交
    HEAD^^ 上一次的 上一次的提交(倒数第三次)
    HEAD^^^ 倒数 第四次的 提交
    HEAD~0 最近一个提交
    HEAD~1 上一次提交
    HEAD^2 上一次的 上一次的提交(倒数第三次)
    HEAD^3 倒数 第四次的 提交
1
“^”代表父提交,当一个提交有多个父提交时,可以通过在”^”后面跟上一个数字,表示第几个父提交,”^”相当于”^1”.
1
~<n>相当于连续的<n>个”^”.
1
checkout只会移动HEAD指针,reset会改变HEAD的引用值。
1
HEAD~2 = HEAD^^ = HEAD^1^1
1
git reset --soft HEAD^^

checkout file 抛弃修改

1
git checkout config.rb

修改未提交到暂存区

remote 查看远端

1
git remote

remote url 查看远端url

1
git remote -v

pull 拉取

1
git pull origin master

git pull origin remote : local
git push origin local : remote

remote add 添加远端仓库

1
git remote add origin https://github.com/githug/githug

push 推送

1
2
git rebase origin/master
git push origin master

diff 对比

1
git diff
  • git diff: 查看 working directory 与 staging area 之间的差异
  • git diff –cached: 查看 repository 与 staging area 之间的差异
  • git diff HEAD: 查看 working directory 与 repository 之间的差异

blame 查看文件修改人

1
git blame config.rb

branch 创建查看分支

1
git branch test_code
1
git branch

checkout 检出

1
git checkout my_branch

git checkout -b my_branch创建并切换

checkout tag 切换到特定标签

1
git tag
1
git checkout v1.2

checkout tag over branch 标签分支重名情况下切换

1
git checkout tags/v1.2

分支和标签重名情况

branch at 根据提交创建新分支

1
git branch test_branch HEAD^^

delete branch 删除分支

1
git branch -d delete_me

push branch 推送分支

1
git push origin test_branch:test_branch

merge 合并分支

1
git merge feature

fetch 获取远端修改

1
git fetch origin

获取远端的修改,但是并不合并到当前分支。其实,git pull 就是 git fetch 和 git merge 组成的。

rebase 重新基于

1
git log --graph --all
1
git rebase master feature
1
git checkout feature
1
git merge master

git rebase 这个命令。大概意思是从某个提交分化出两个分支,然后其中一个分支需要将另一个分支的修改合并过来,但是又不想在提交记录上留下两个分支合并的痕迹,只留下一个分支以前后顺序记录两边的修改。
git rebase 一个分支的所有修改在另一个分支上重新应用一遍,所以在提交记录上看,会发现一个分支的所有提交在另一个分支之前或者之后。然后删除另一个被合并的分支,保持分支简洁。
git rebase master feature 表示将 feature 上的修改在 master 上重新应用一遍
需要非常注意的是,不要 rebase 哪些已经推送到公共库的更新

repack 打包

1
git repack
1
git repack -d

cherry pick 应用提交修改

1
git log --all
1
git cherry-pick ca32a6dac7b6f97975edbe19a4296c2ee7682f68

grep 搜索

1
git grep TODO

git grep支持各种条件搜索及正则表达式

rename commit 重命名提交

1
git rebase -i 3c2a40935b12a56edf6063925aae619147ecfd01
1
git rebase -i HEAD~2
  1. pick :不做任何修改;
  2. reword:只修改提交注释信息;
  3. edit:修改提交的文件,做增补提交;
  4. squash:将该条提交合并到上一条提交,提交注释也一并合并;
  5. fixup:将该条提交合并到上一条提交,废弃该条提交的注释;
  6. 如果删除了某行记录,比如删除“pick G 注释”,这条提交也会被删除。

squash 合并提交

1
git rebase -i HEAD~4

将弹出编辑页的第2、3、4行的pick改为squash

merge squash 分支所有修改应用成一个提交

1
git merge --squash long-feature-branch

将某个分支上的所有修改都应用成一个提交。默认修改都将进入暂存区

reorder 从新排列提交

1
git rebase -i HEAD~2

重新排列提交顺序

bisect 快速定位错误版本

1
git bisect start master f608824888b83
1
git bisect run make test

git bisect start master f608824888b83 中,master 是有 bug 的节点,f608824888b83 是没有 bug 的节点。

stage lines 提交文件部分修改

1
git add -p feature.rb

e编辑提交内容

find old branch 列出操作记录

1
git reflog
1
git checkout solve_world_hunger

查看操作历史

revert 回滚

1
git revert HEAD^^

与 reset 不同的是,revert 只会撤销当前的 commit,而之后的 commit 操作的修改还会保留,但是reset 还会将之后的所有 commit 操作的修改全部退回 staging area 或丢弃。

restore 恢复

1
git reflog

git reflog 可以查看所有的操作记录,所以只要能找到误操作之前的 commit id,一样能够恢复现场。

conflict 冲突

1
git merge mybranch

编辑poem.txt文件,处理冲突

1
git add poem.txt

1
git ci -m 'merge mybranch`

submodule 子模块

1
git submodule add https://github.com/jackmaney/githug-include-me