Git

毋庸置疑,Git 是目前最流行、最好用的版本控制系统,在它的基础上,催生出了 GitHub 和 GitLab 两个当前最流行的代码托管平台。

git 图解

配置

1
2
3
4
5
6
git config —-global user.name ‘your_name’
git config —-global user.email ‘your_email@domain.com’

git config --local --list
git config --global --list
git config --system --list

创建 Git Repo

  1. 把已有代码纳入到 git 管理. git init

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ls -al

    git init
    git add .
    git add -u 更新内容替换暂存区
    git rm filename
    git status
    git commit -m ‘message’
    git log
  2. 新建项目直接用 git 管理. git init your_project

git 命令

git model
上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。

  • git add files 把当前文件放入暂存区域。
  • git commit 给暂存区域生成快照并提交。
  • git reset – files 用来撤销最后一次 git add files,你也可以用 git reset 撤销所有暂存区域文件。
  • git checkout – files 把文件从暂存区域复制到工作目录,用来丢弃本地修改。
    你可以用 git reset -p, git checkout -p, or git add -p进入交互模式。

skip stage

  • git commit -a 相当于运行 git add 把所有当前目录下的文件加入暂存区域再运行。git commit.
  • git commit files 进行一次包含最后一次提交加上工作目录中文件快照的提交。并且文件被添加到暂存区域。
  • git checkout HEAD – files 回滚到复制最后一次提交。

git init

git add/rm

1
2
3
4
5
6

git add
find .git/objects -type f

# 删除文件
git rm <file_name>

git status

git commit

git commit - master
git commit - branch

1
2
3
4
5
# 暂存区内容做提交
git commit -m'commit msg'
# 工作区内容直接提交不经过暂存区
git commit -am'commit msg'
git commit -m 'messge' --author="name<email>"指定commit的作者的名字和邮箱

git mv

文件重命名

1
2
3
4
5
6
git mv readme readme.md

## 等同于
mv readme readme.md
git add readme.md
git rm readme

git log

  • git log –all 查看所有分支的历史
  • git log –all –graph 查看图形化的 log 地址
  • git log –oneline 查看单行的简洁历史。
  • git log –oneline -n4 查看最近的四条简洁历史。
  • git log –oneline –all -n4 –graph 查看所有分支最近 4 条单行的图形化历史。
  • git help –web log 跳转到 git log 的帮助文档网页

Notes: enter q to exit.

git config --system --list

1
2
3
4
5
alias.l=log --graph --all --pretty=format:'%C(yellow)%h%C(cyan)%d%Creset %s %C(white)- %an, %ar%Creset'
alias.ll=log --stat --abbrev-commit
alias.lg=log --color --graph --pretty=format:'%C(bold white)%h%Creset -%C(bold green)%d%Creset %s %C(bold green)(%cr)%Creset %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
alias.llg=log --color --graph --pretty=format:'%C(bold white)%H %d%Creset%n%s%n%+b%C(bold blue)%an <%ae>%Creset %C(bold green)%cr (%ci)' --abbrev-commit
alias.d=diff
1
2
3
git lg
git ll
git llg

git 自带了图形界面工具gitk. 在 repo folder 下面运行gitk。效果如下:
gitk

1
2
gitk
gitk --all

git checkout

git checkout HEAD~
git checkout branch
git checkout branch~3

1
2
3

# 废弃工作区变更
git checkout -- [<file_name>]

git branch

1
2
3
4
5
# 查看所有分支
git branch -av
# 删除分支
git branch -d <branch_name>
git branch -D <branch_name>

git cat-file

1
2
3
4
5
find .git/objects -type f
# show content
git cat-file -p uuid
# show type
git cat-file -t uuid

git rebase

1
2
3
4
5
# change old commit message
git rebase -i <parent-commit-id> # with r

# combine commits 合并commits
git rebase -i <parent-commit-id> # with s

git diff

git diff

1
2
3
4
5
6
7
8
9
10
11
# 比较工作区和暂存区区别。
git diff
git diff -- [<file_name>]

#暂存区和HEAD进行比较
git diff --cached

# 比较某文件两次不同提交的差异
git diff <commit_id1> <commit_id2> -- <file_name>
# 比较某文件两个不同分支的差异
git diff <branch_1> <branch_2> -- <file_name>

git reset

git reset HEAD~3
reset 命令把当前分支指向另一个位置,并且有选择的变动工作目录和索引。也用来在从历史仓库中复制文件到索引,而不动工作目录。

  • 如果不给选项,那么当前分支指向到那个提交。
  • 如果用–hard 选项,那么工作目录也更新,
  • 如果用–soft 选项,那么都不变。

git reset
如果没有给出提交点的版本号,那么默认用 HEAD。这样,分支指向不变,但是索引会回滚到最后一次提交,如果用–hard 选项,工作目录也同样。

1
2
3
# 取消暂存区所有内容,跟HEAD保持一致
git reset HEAD
git reset --hard <commit_id>

git reset -- files
如果给了文件名(或者 -p 选项), 那么工作效果和带文件名的 checkout 差不多,除了索引被更新。

git cherry-pick

cherry-pick image
cherry-pick 命令”复制”一个提交节点并在当前分支做一次完全一样的新提交。

Furhter

感谢支持,让我安静的做蚂蚁梦!