Git
git basics
# 在指定的目录下创建一个空的repo,不带参数则在当前目录下创建
git init <directory>
# 克隆一个指定的repo到本地
git clone <repo>
# 针对当前repo配置用户名,使用--global参数将配置全局用户名
git config user.name <name>
# 将指定目录的所有修改加入到下一次commit中,把<directory>换成<file>将添加指定文件的修改
git add <directory>
git add .
# 提交暂存区的修改,使用指定的<message>作为提交信息
# 如果<message>里没有空格,可以不用引号,有空格必须加引号,如果有单引号,外面就用双引号,如果有双引号,外面就用单引号
git commit -m "<message>"
# 显示哪些文件已被staged、未被staged以及untracked。
git status
# 以默认格式显示commit历史
git log
git diff
# 比较工作区和暂存区的修改
git diff
# 比较工作区和上一次commit后的修改
git diff HEAD
# 比较暂存区和上一次commit后的修改
git diff --cached
undoing changes
# 根据指定的<commit>创建一个新的undo的commit,并应用到当前的分支
git revert <commit>
# 将<file>从暂存区移除,但保持工作区不变。此操作不会修改工作区的任何文件
git reset <file>
rewriting git history
# 修改最近一次commit的<message>
git commit --amend
# 将当前staged修改合并到最近一次的commit中,并更改message
git commit -m <message> --amend
# 基于<base>对当前分支进行rebase,<base>可以是commit、分支名称、tag或者相对于HEAD的commit
git rebase <base>
# 显示本地repo的所有commit日志
git reflog
git branches
# 显示本地repo的所有分支
git branch
# 创建名为name的分支
git branch <name>
# 创建并切换到一个新的名为<branch>的分支。去掉-c参数将切换到一个已有的分支
git switch -c <branch>
# 将指定<branch>分支合并到当前分支,当合并分支发生冲突时,需要手动解决冲突,然后add和commit,才能完成合并
git merge <branch>
# 指定 --no-ff参数来强制禁用 Fast forward模式,由于要生成一个新的commit,所以需要-m
git merge --no-ff -m "merge with no-ff" dev
# 切换分支,加-b参数可以创建新分支
git checkout <branch>
git checkout -b dev origin/dev
# 建立本地分支和远程分支的关联
git branch --set-upstream branch-name origin/branch-name
# 删除dev分支
git branch -d/D dev
# 将当前分支重命名
git branch -m <newname>
remote repositories
# 添加一个新的远程连接。添加后可使用<name>作为指定<url>远程连接的名称。
git remote add <name> <url>
# 从指定<remote>抓取指定<branch>的所有commit到本地repo。去掉<branch>将抓取远程所有分支的修改。
git fetch <remote> <branch>
# 使用远程分支覆盖当前本地分支
git fetch
git reset --hard <remote>/<branch_name>
# 从指定<remote>抓取所有分支的commit并立刻合并到本地repo。
git pull <remote>
# 将本地指定<branch>推送到指定远程<remote>。如果远程没有对应的分支,将自动在远程创建此分支。
git push <remote> <branch>
git config
# 配置当前用户名,使用--global参数将针对当前系统登录用户生效,及对当前机器上的所有git repo 起效,也可以在某个git目录下单独指定不同的用户名和email,只需要去掉--global即可
git config --global user.name <name>
# 配置当前用户Email。
git config --global user.email <email>
# 配置一个git命令的快捷方式。例如:配置"alias.glog log --graph --oneline”使"git glog”相当于"git log --graph --oneline".
git config --global alias.<alias-name> <git-command>
# 配置文本编辑器,例如vi,在必要时自动打开此文本编辑器。
git config --system core.editor <editor>
# 打开当前用户的git全局配置并编辑。
git config --global --edit
# 对命令行的输出增加颜色
git config --global color.ui true
# 每个git仓库的配置文件都放在.git/config文件中
# 当前用户的全局git配置文件放在~/.gitconfig文件中
git log
# 限制log的显示数量。例如:”git log -5”仅显示最新5条commit。
git log -<limit>
# 每行显示一条commit。
git log --oneline
# 按提交者名字搜索并显示commit。
git log --author="<pattern>"
# 按指定内容搜索并显示commit。
git log --grep="<pattern>"
# 显示指定范围的commit。范围参数可以是commit lD、分支名称、HEAD或任意相对位置。
git log <since>..<until>
# 仅显示包含指定文件修改的commit。
git log -- <file>
# 使用--graph参数显示图形化的branch信息。
git log --graph
# 查看分支的合并情况
git log --graph --pretty=oneline --abbrev-commit
# 一行可视化查看所有的commit
git log --pretty=oneline --abbrev-commit
git reset
# 移除所有暂存区的修改,但不会修改工作区。
git reset
# 移除所有暂存区的修改,并强制删除所有工作区的修改。
git reset --hard
# 将当前分支回滚到指定<commit>,清除暂存区的修改,但保持工作区状态不变
git reset <commit>
# 在git中,用HEAD指针指向上一次提交,也即单前的最新版本,可以通过reset来回退到上一次提交之后的代码状态,HEAD^指向上上次提交,HEAD^^指向上上上次提交,HEAD~100指向倒数第100个提交
git reset [--hard/soft] HEAD
# 把暂存区对file文件的修改撤销掉(unstage),重新放回工作区。
git reset HEAD <file>
# 回退版本之后,如果想要回到未来,就需要知道未来的commit ID,ID都可以在git reflog里找到
git reset [--hard/soft] <commit ID>
# 将当前分支回滚到指定<commit>,清除暂存区的修改,并强制删除所有工作区的修改。
git reset --hard <commit>
git rebase
# 以交互模式对当前分支做rebase。
• pick:保留该commit(缩写:p)
• reword:保留该commit,但需要修改该commit的注释(缩写:r)
• edit:保留该commit, 但要停下来修改该提交(不仅仅修改注释)(缩写:e),会跳转到一个临时分支,可以更改提交和更改注释,然后最后merge
• squash:将该commit和前一个commit合并(缩写:s)
• fixup:将该commit和前一个commit合并,但不保留该提交的注释信息(缩写:f)
• exec:执行shell命令(缩写:x)
• drop:丢弃该commit(缩写:d)
git rebase -i <base>
git pull
# 抓取所有远程分支,并以rebase模式并入本地repo而不是merge。
git pull --rebase <remote>
git push
# 将本地分支推送到远程。使用--force 参数则直接用本地的更改替换远程的。
git push <remote> --force
# 使用push命令并不会自动将本地tag推送到远程。加上--tags参数会将所有本地tag推送到远程。
git push <remote> --tags
# 将master分支的修改推送到远程仓库origin
git push origin master
# 将本地分支dbg_lichen_star推到远程仓库,并命名为dbg_lichen_star
git push origin dbg_lichen_star:dbg_lichen_star
# 删除名为dbg_lichen_star的远程分支
git push origin --delete dbg_lichen_star
git clean
# 用来从你的工作目录中删除所有没有tracked过的文件
git clean
# 是一次clean的演习, 告诉你哪些文件会被删除. 记住他不会真正的删除文件, 只是一个提醒
git clean -n
# 删除当前目录下所有没有track过的文件. 他不会删除.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过
# git reset --hard和git clean -f是一对好基友. 结合使用他们能让你的工作目录完全回退到最近一次commit的时候
git clean -f
# 删除指定路径下的没有被track过的文件
git clean -f <path>
# 删除当前目录下没有被track过的文件和文件夹
git clean -df
# 删除当前目录下所有没有track过的文件. 不管他是否是.gitignore文件里面指定的文件夹和文件
git clean -xf
git 文件
Git管理的文件分为:工作区,版本库,版本库又分为暂存区stage和暂存区分支master(仓库)
工作区>>>>暂存区>>>>仓库
git add 把文件从工作区>>>>暂存区,git commit 把文件从暂存区>>>>仓库,
git diff 查看工作区和暂存区差异,
git diff --cached 查看暂存区和仓库差异,
git diff HEAD 查看工作区和仓库的差异,
git add 的反向命令 git checkout ,撤销工作区修改,即把暂存区最新版本转移到工作区,
git commit 的反向命令 git reset HEAD ,就是把仓库最新版本转移到暂存区。
git diff 时是分为两种情况的:暂存区为空和暂存区不为空。
首先我们明确知道 git diff 是比较工作区和暂存区的文件的,如果此时暂存区为空,那么稍微有点不同,即:
1.暂存区为空使用 git diff :因为此时暂存区为空,此时使用 git diff 同样也是比较工作区和仓库,即和使用 git diff HEAD 结果相同
2.暂存区不为空使用 git diff :因为此时暂存区不为空,此时使用 git diff 比较的就是工作区和暂存区
git checkout
# 让这个文件回到最近一次git commit或git add时的状态
# 两种情况,一种是readme.txt自修改后还没有被 git add (放到暂存区),现在,撤销修改就回到修改之前的状态(上一次 git commit之后);
# 一种是readme.txt已经 git add (添加到暂存区)后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态(上一次 git add 之后)。
git checkout -- readme.txt
git rm
# 从版本库中删除该文件,然后需要 git commit 完成删除
# 如果误删,可以 git checkout 恢复
git rm <file>
远程仓库
1. 本地生成SSH key,然后添加到Github
2. 关联本地仓库到远程,其中为远程仓库的命名origin可以自定义
git remote add origin git@github.com:michaelliao/learngit.git
# 查看已经关联的远程仓库信息
git remote -v
# 解除本地目录和远程origin仓库的连接
git remote rm origin
git stash
# 暂存改动,用栈来保存,最新的暂存是stash@{0}
git stash
# 显示已暂存的所有改动
git stash list
# 恢复之前暂存的stash@{0}
git stash apply stash@{0}
# 删除之前暂存的stash@{0}
git stash drop stash@{0}
# 恢复之前暂存的stash@{0},并删除stash@{0}
git stash pop
git cherry-pick
# 从其他分支上复制一个更改到当前分支,避免重复劳动
git cherry-pick <commit id>
git tag
# 标签(tag)是指向commit的死指针,分支是指向commit的活指针
# 为当前分支的当前最新的commit打一个v1.0的标签,也就是默认打到HEAD上
git tag v1.0
# 查看当前分支的所有标签
git tag
# 给<commit id>打一个v0.9的标签
git tag v0.9 <commit id>
# # 给<commit id>打一个v0.1的标签并附带message
git tag -a v0.1 -m "version 0.1 released" <commit id>
# 查看标签信息
git show <tagname>
# 推送本地创建的v1.0标签到远程仓库
git push origin v1.0
# 推送本地创建的所有标签到远程仓库
git push origin --tags
# 删除本地的v1.0标签
git tag -d v0.1
# 删除远程仓库中的v1.0标签
git push origin :refs/tags/v0.1
reference
http://git-scm.com
https://git-scm.com/docs