参考:史上最浅显易懂的Git教程!

  • 进入你的工作目录

    cd yourworkpath

  • 列出所有branch,当前所在branch前面有“*”号。

    git branch -a

  • 切换工作库

    git checkout v1.5.1

  • 合并另一个branch,通常是master

    git merge master

  • 再切换回来

    git checkout master

  • 查看当前目录情况

    git status

  • 将当前目录中的修改提交到相应的库(branch)中

    git commit -m ““此处添加修改说明””

  • 从远程库中合并最新状态

    git pull

注:当使用git pull命令的时候如果提示有本地文件修改了,无法合并的时候,我们可以放弃本地修改(注意放弃的修改将不可恢复),然后再更新; 如果不想放弃本地修改,可以先提交,然后再合并更新。 如果要放弃本地修改后更新:

git reset –hard git pull

  • 将合并后的状态并入远程库中。

    git push origin master

  • 如果是在分支上开发则为:

    git push origin v1.5.1

  • 取消某个文件的版本控制,但实际不删除这个文件:

    git rm –cached somefile.txt

然后再修改目录下的.gitignore文件,添加上这个文件的相应忽略即可。

  • 查看每一行的改动:

    git blame <filename>

  • git 查看一个文件的所有修改历史

    git log –pretty=oneline <filename>

  • 创建一个分支并切换到这个分支工作,通常可用于临时进行一些测试性的开发,如果要保留这个dirty的分支内容,可以commit上去,随时再切换回master就象一切没发生过。

    git checkout -b dirty

  • 如果这个测试性的开发需要被接受合并到主干master,只要切换到master再合并即可:

    git checkout master git merge dirty

  • 丢弃加入缓存区(即git add的准备提交的文件)的修改,分别退回到当前版本、上一个版本、上上一个版本、前99个版本、某特定 id 版本:

    git reset –hard HEAD git reset –hard HEAD^ git reset –hard HEAD^^ git reset –hand HEAD~99 git reset –hard 322542re342

  • 查看过去和未来的版本 id 等信息:

    git log git reflog

  • 丢弃某个文件的修改,和SVN的revert命令一样

    git checkout – comefile.txt

  • 丢弃本地所有文件的修改,和SVN的revert命令一样

  git checkout -- *.*
  • 查看当前路径下的远程库情况:
git remote -v
  • 添加远程库路径
git remote add origin https://github.com/wind13/xxx.git
  • 查看分支详细信息
git branch -vv
  • 更换本地分支对应的远程分支
git branch --set-upstream-to=origin/master master
  • 显示当前设置及来源
git config --list --show-origin
  • 本地删除除master以外所有分支
git branch | grep -v "master" | xargs git branch -D
  • 保存当前修改,切换到 master 并删除 master 以外所有分支
git stash && git checkout master && git branch | grep -v "master" | xargs git branch -D
  • 快速本地复制一个库到另一个目录,不带多余的文件:
git fast-export --all | (mkdir ../repobackup && cd ../repobackup && git init && git fast-import && git reset --hard HEAD)
  • 分拆代码库

    git filter-branch --prune-empty --subdirectory-filter ./folder/to/subrepo/ branch-name
    git filter-branch --prune-empty --subdirectory-filter ./folder/to/subrepo/ -- --all
    
    • 如果分拆有误,想退回

      git reflog
      

      查看到具体要回到哪个点,记住HEAD{n}里面那个数字n; 然后再执行 reset 回到那个位置:

      git reset --hard HEAD@{n}
      
  • 使用GIT SUBTREE集成项目到子目录

    • 第一次添加子目录,建立与git项目的关联
    git remote add -f ai https://github.com/aoxu/ai.git  
    git subtree add --prefix=ai ai master --squash
    
    • 从远程仓库更新子目录
    git fetch ai master  
    git subtree pull --prefix=ai ai --squash
    
    • 从子目录push到远程仓库
    git subtree push --prefix=ai ai master
    
  • 通过 Commits 信息查找
# 所有分支
git log --all --grep='search string'
# 包含 reflog
git log -g --grep='search string'
  • 通过更改查找
git log -S 'search string'
  • 通过日期范围查找
git log --after='DEC 15 2019' --until='Jan 10 2020'

常用的别名 (2020年2月28日 添加)

# 撤销上次提交
git config --global alias.undo "reset --soft HEAD^"

# 将暂存区更新修订到上次提交 (不改变提交信息)
git config --global alias.amend "commit --amend --no-edit"

# 压缩的状态输出
git config --global alias.st "status -sb"

# 用 GRAPH 为日志着色
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'"

# 删除所有已合并的分支(测试有问题)
# git config --global alias.rmb "!git branch --merged | grep -v '*' | xargs -n 1 git branch -d"

# 贡献排行
git config --global alias.rank "shortlog -n -s --no-merges"