安装
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 目录
- [options]
取回和推送
推送分支到远程分支
- 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 # 正则匹配
- <option>
清理
- 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
- 不输出
- -p | -u | –patch
- git diff [<option>] [–] [<path>…]
git diff
命令的输出可以直接作为补丁使用
-
git format-patch
- git format-patch -1 [<commit>]
- 生成指定commit的补丁
- git format-patch -1 [<commit>]
-
git apply
- git apply [<option>] [<patch>…]
- 应用一个补丁文件
- git apply [<option>] [-R | –reverse] [<patch>…]
- 撤销一个补丁
- <option>
- –ignore-space-change | –ignore-whitespace
- 忽略空格
- –ignore-space-change | –ignore-whitespace
- git apply [<option>] [<patch>…]
配置
-
git config
- git config [<file-option>] name [value [value_regex]]
- 修改一个键值
- git config [<file-option>] -e | –edit
- 直接编辑配置文件
- git config [<file-option>] name [value [value_regex]]
-
[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