安装

Git For Windows in MSYS2

https://github.com/git-for-windows/git/wiki/Install-inside-MSYS2-proper

概念

The Refspec (引用指定)

  • [+]<src>:<dst>
    • [+] # 强制更新
    • <src> # 本地引用
    • <dst> # 远端引用

表示本地分支和远端分支的映射关系

拉取引用

通常.git/config中会默认指定这个映射,在fetch或是pull时会使用该映射。

[remote "origin"]
   url = git@github.com:schacon/simplegit-progit.git
   fetch = +refs/heads/*:refs/remotes/origin/*

修改该映射该映射可以使得默认的fetch或是pull命令获取指定分支。

[remote "origin"]
   url = git@github.com:schacon/simplegit-progit.git
   fetch = +refs/heads/master:refs/remotes/origin/master
   fetch = +refs/heads/experiment:refs/remotes/origin/experiment

同时指定多个引用也是允许的。

推送引用

通过相同的方法,也可以修改push命令的默认行为。

[remote "origin"]
       url = git@github.com:schacon/simplegit-progit.git
       fetch = +refs/heads/*:refs/remotes/origin/*
       push = refs/heads/master:refs/heads/qa/master

这里的远程分支用到了名为qa的命名空间。

删除引用

git push origin :topic

通过留空的引用,删除topic分支

命令行

仓库

  • git clone [/path|ssh://] [dst_path] #克隆新仓库

  • git init [options] [path] # 初始化一个新仓库

    • [options]
      • –bare # 初始化一个纯仓库,可用于服务端
      • –separate-git-dir # 指定外部 git 目录

取回和推送

推送分支到远程分支

  • git push [–all | –mirror | –tags] [–follow-tags] [–atomic] [-n | –dry-run] [–receive-pack=<git-receive-pack>] [–repo=<repository>] [-f | –force] [-d | –delete] [–prune] [-v | –verbose] [-u | –set-upstream] [-o <string> | –push-option=<string>] [–[no-]signed|–signed=(true|false|if-asked)] [–force-with-lease[=<refname>[:<expect>]]] [–no-verify] [<repository> [<refspec>…​]]

推送无关分支 $ git pull –allow-unrelated-histories

合并

自动合并

  • git merge <merge_branch_name> #合并一个分支
  • git commit #提交修改
  • git commit -m “commit message” #提交修改附带消息

手动合并

变基

  • git rebase
  • git rebase –onto <new_base>

恢复

逆向操作,恢复一个 commit。

  • git revert

分支

  • git branch
  • git branch <new_branch_name> #从 HEAD 新建分支
  • git branch -a #显示远程分支
  • git branch -vv #显示本地分支及追踪的分支
  • git branch –set-upstream-to=origin/<branch> master #设置远程跟踪

远程

  • git remote
    • [-v | –version] 详细
    • add [-t <branch>] [-m <master>] [-f] [–[no-]tags] [–mirror=<fetch|push>] <name> <url>
    • remove <name>

Stashing (储藏)

  • git stash [push [-p|–patch] [-k|–[no-]keep-index] [-q|–quiet] [-u|–include-untracked] [-a|–all] [-m|–message <message>] [–] [<pathspec>…​]] # 向暂存区保存当前工作,并清空工作区
  • git stash list [<options>]
  • git stash ( pop | apply ) [–index] [-q|–quiet] [<stash>] # 提取暂存区的工作
  • git stash drop [-q|–quiet] [<stash>]

日志

  • git log [<option>] [<revision range>] [[–] <path>]
    • <option>
      • -n <number> # 控制日志条数
      • -p # 查看差异
      • –stat # 简要文件差异
      • –name-status # 查看新增、修改和删除
      • –summary # 显示摘要
      • –diff-filter # 使用过滤
      • –grep # 正则匹配

清理

  • git clean -f #删除 untracked files
  • git clean -fd #连 untracked 的目录也一起删掉
  • git clean -xfd #连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
  • git clean -nxfd #在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删

差异和补丁

  • git diff
    • git diff [<option>] [–] [<path>…]
      • 默认比较工作区和暂存区
    • git diff [<option>] [<commit>] [–] [<path>…]
      • 比较工作区和commit。
    • git diff [<option>] –cached [<commit>] [–] [<path>…]
      • 比较暂存区和commit。
    • git diff [<option>] <commit> <commit> [–] [<path>…]
      • 比较两个commit。
    • <option>
      • -p | -u | –patch
        • 生成 patch
      • -s | –no-patch
        • 不输出

git diff命令的输出可以直接作为补丁使用

  • git format-patch

    • git format-patch -1 [<commit>]
      • 生成指定commit的补丁
  • git apply

    • git apply [<option>] [<patch>…]
      • 应用一个补丁文件
    • git apply [<option>] [-R | –reverse] [<patch>…]
      • 撤销一个补丁
    • <option>
      • –ignore-space-change | –ignore-whitespace
        • 忽略空格

配置

  • git config

    • git config [<file-option>] name [value [value_regex]]
      • 修改一个键值
    • git config [<file-option>] -e | –edit
      • 直接编辑配置文件
  • [core]

    • autocrlf 自动转换换行符
    • filemode 保持文件权限
    • editor 编辑器
    • pager 翻页工具
  • [diff]

    • tool
    • guitool
  • [i18n]

    • commitencoding 提交改动编码
    • logoutputencoding 日志输出编码

设置代理

设置全局代理

git config --global http.proxy socks5://10.64.0.2:1080
git config --global https.proxy socks5://10.64.0.2:1080

取消设置

git config --global --unset http.proxy
git config --global --unset https.proxy

仅为 github 设置代理

git config --global http.https://github.com.proxy socks5://10.64.0.2:1080

创建仓库

从其它仓库克隆,支持 http/https、ssh 和本地路径。

git clone http://github.com/youmu129/notes.git

拉取和合并远程更新

在不知道远程分支情况的时候可以只拉取,不合并到本地。 防止本地分支被覆盖。

git fetch

合并远程分支,不应使用默认的 pull 命令。 不带参数情况下 pull 将以 merge 形式合并远程和本地分支。

在没有冲突的情况下当仅允许快速合并。

git pull --ff-only

如果本地和远程冲突存在冲突,应当 rebase 当前提交到远程分支上。 这样可以避免提交不必要的合并记录。 如果 rebase 发生冲突,按正常 rebase 时合并冲突解决即可。

git pull --rebase

可以通过 config 命令修改 pull 的默认行为,限制只允许快速合并。

git config --global pull.ff only

浅层仓库

仅拉取当浅层分支,减少拉取数据,这样执行的比较快。 但是这样拉取的仓库为 shallow repository(浅层仓库),和完整仓库相比,部分功能不受支持。

git fetch --depth=1 origin master

浅层仓库转换完整仓库。

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch --unshallow

提交历史控制

使用衍合合并多个提交,可以减少 commit 的个数。

git rebase -i HEAD~2   // 合并前两个提交

在其它分支上重放当前修改。

git rebase [branch]

指定在一个 branch 上重放一段 commit。

git rebase --onto [base_branch] [begin_branch] [end_branch]

补丁管理

生成指定 commit 的 patch。

git format-patch -1 <commit>

合并 patch

git am <patch>

换行符控制

主要由 core.autocrlf 和 core.safecrlf 两个配置项控制。

core.autocrlf 设置自动转换方式,支持 true、false 和 input 选项。

core.safecrlf 设置对 LF 和 CRLF 混用的文件如果处理,支持 true、false 和 warn 选项。

保证提交到仓库的文件都是 LF 换行符,检出时转换为平台特定换行符。

git config --global core.autocrlf true   

保证提交到仓库的文件都是 LF 换行符,检出时不处理。

git config --global core.autocrlf input   

对 LF 和 CRLF 混用的文件拒绝提交。

git config --global core.safecrlf true   

对 LF 和 CRLF 混用的文件给出警告。

git config --global core.safecrlf warn

引用指定(The Refspec)

  • [+]<src>:<dst>
    • [+] # 强制更新
    • <src> # 本地引用
    • <dst> # 远端引用

表示本地分支和远端分支的映射关系

拉取引用

通常.git/config中会默认指定这个映射,在fetch或是pull时会使用该映射。

[remote "origin"]
   url = git@github.com:schacon/simplegit-progit.git
   fetch = +refs/heads/*:refs/remotes/origin/*

修改该映射该映射可以使得默认的fetch或是pull命令获取指定分支。

[remote "origin"]
   url = git@github.com:schacon/simplegit-progit.git
   fetch = +refs/heads/master:refs/remotes/origin/master
   fetch = +refs/heads/experiment:refs/remotes/origin/experiment

同时指定多个引用也是允许的。

推送引用

通过相同的方法,也可以修改push命令的默认行为。

[remote "origin"]
       url = git@github.com:schacon/simplegit-progit.git
       fetch = +refs/heads/*:refs/remotes/origin/*
       push = refs/heads/master:refs/heads/qa/master

这里的远程分支用到了名为qa的命名空间。

删除引用

git push origin :topic

通过留空的引用,删除topic分支

增加 GPG 签名

设置开启 GPG 签名

git config --global user.signingkey FF2F6602084A29097C95EE4684A321B1C2F8FEB4

设置自动 GPG 签名

git config --global commit.gpgsign true