git 初级使用

git commit --amend --reset-author --no-edit -S // 重置作者并添加签名
git config --global core.autocrlf false

// hotfix 分支合并到 master,同时也合并到 develop 分支,不要将 master 分支合并到 develop

git tag --list --sort=-v:refname "v*"
// git describe --all --match "v*" --abbrev=0 // 匹配有描述的最新 tag

所有修改都是新建分支,测完没问题再 Merge 到 develop,merge commit 的 message,写一下这个分支做了什么修改
.gitignore // 忽略文件
git add --force pkg // 单次添加忽略文件
git config --global push.default current // 设置push默认分支
git config 设置用户信息,git remote 设置远端 // 使用 ssh 时要用 ssh 协议链接远端,set-url 修改远端地址
git init(需要远端新建repo和本地执行remote add操作) 或 git clone 新建仓库
工作流:工作目录,缓存区(index),HEAD

git submodule update --remote --init / git clone --recurse-submodules ...

先要add文件添加到缓存区。放弃修改git checkout -
修改后提交更改 commit 到HEAD区
新添加上次漏掉的文件后可以使用参数 --amend 重新提交。

--grep filter,顾名思义
git diff 查看不会被提交的修改(没有staged(添加到索引中))
git diff --cached 查看提交时会修改的内容
git diff HEAD 查看当前所有自HEAD的修改
// 鼠标滚动 git config --global --replace-all core.pager 'less -+X'
git diff dev..test 查看两个分支差异
git diff dev...test 查看test从dev上创建分支时到目前所做的修改(dev和test共有父分支与test的差异)
git diff test 当前目录与test比较,可以加上 -- ./lib 来比较特定文件
--stat 只进行简单统计
git show [commit] 显示某次提交的元数据和内容变化 // 和 log 一样可以排除文件:git show -- . ':!some/path'
git blame 显示每行修改
git log -p 显示文件修改历史详情
在 commit 更新后push到远程 git push
之前要 pull [remote branch]从远程拉下来以更新到最新(push时要在远端新建repo)//可以改用fetch + rebase

git revert HEAD 撤销最近的一个提交,生成一个新的提交(适用于代码已发布的情况)
git reset HEAD ... 的方式取消暂存(add反动作)
git rm --cache 从暂存中删除文件(不会真正删除,而是从库移除)// 取消跟踪

git reset HEAD~2 回退两个 commits // HEAD^ 表示前
git reset --hard 回退到历史版本(git reflog查看所以记录包括 reset 记录)(commit或者HEAD@{}),可用远端覆盖本地当前分支(后面参数为远端名\/分支名)。 // 无效时先尝试 git pull -Xtheirs
git reset --soft 回退 commit,修改在 stage 中
git reset --merge 取消合并,跟新版本的git merge --abort一样
git checkout -- 将HEAD指向历史版本进行查看
git checkout -f A -- . # 回退到 A 到内容
git clean -fd 删除未跟踪文件
git bisect start/good/bad 使用二分法来查找目标 commit

git log --pretty=oneline查看提交信息和文件修改历史, -p显示详细
git log --all --graph --decora图形化()查看所有分支所有操作
--since='1 sunday ago'
创建命令别名:git config --global alias.st status
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

git lg -- Sub-dir 过滤只修改子目录的 log

创建分支开发,之后可以合并,!!!一个分支只做一件事情!!!
git branch创建分支(不会自动切换,checkout -b新建并切换),--track 设置分支跟踪,-m move/rename分支
git branch -r 查看远端所有分支,-d删除分支,-dr [remote/branch] 删除远程分支
git branch [branch] [commit] 新建分支指向指定commit
切换分支 git checkout(替换本地文件也用这个,切换到本地没有的远端分支时会自动创建同名分支并跟踪远端分支)
// --recurse-submodules 包含子模块
切换分支又不想提交一半的修改:git stash暂存,git stash list查看,git stash apply 【stash@{2}】应用
git checkout . 取消本分支所有更改(不可恢复!!!
git reset HEAD 取消本分支所有更改包括 stage
git reset HEAD^ 回退当前提交到工作区

git cherry-pick [commit] 选择一个commit,合并进当前分支
合并其他分支到当前分支用git merge 合并之前可以用git diff查看
git fetch 拉取远端更新,它取回的代码对你本地的开发代码没有影响
--all 拉取所有分支?
--prune 这个参数能在获取远端代码时,将远端已删除的分支,在本地也删掉。 这样你本地 origin 就不会有遗留的其他分支了
git merge feat 将 feat 合并到当前分支 // 在合并过程中取消:git reset --hard HEAD~ // 完成 git commit
git pull = git fetch + git merge。推荐后者
解决冲突文件就add,之后commit结束合并
合并其它分支还可以用 git rebase 目标分支名(可以加origin),直接指向目标分支(不会留下merge 命令一样的 commit痕迹,不能用于多人公用的分支)

git push -f (2.0以后push默认上传到当前分支,-f 是 force强制覆盖)
git push [远程名] :[分支名] 删除远程分支,将本地空分支(没有填写)上传到远程分支实现。在服务器上删除需要在 fetch
// push local branch with same name as remote tag: git push origin refs/heads/product:refs/heads/product
后添加 —prune 参数删除本地的 origin 记录。
也可以使用删除远端分支:git push origin --delete serverfix


拉取远端改动 和 提交获取远端版本并覆盖本地分支:
git fetch origin + git reset --hard origin master

filter-branch全局性地修改电子邮件地址或者将一个文件从所有提交中删除
// git filter-branch --tree-filter 'rm -f passwords.txt' HEAD //在当前分支(-all :所以)的所以快照中删除文件并将指针移动到末尾

master 这个很好理解,它代表本地的某个分支名。
origin master 代表着两个概念,前面的 origin 代表远程名,后面的 master 代表远程分支名。
origin/master 只代表一个概念,即远程分支名,是从远程拉取代码后在本地建立的一份拷贝(因此也有人把它叫作本地分支)。

在git status 中按I可以忽略文件,按S/U添加/撤销添加文件,ctrl+shift+s/u添加所有,按C提交文件更改,ctrl+a然后delete中止提交,按D查看变化,enter临时打开文件