配置工具
查看配置:
$ git config user.name
$ git config user.email
设置当前仓库的user.name/user.emali:
$ git config user.name "[name]"
$ git config user.emali "[email address]"
对所有本地仓库的用户信息进行配置:
$ git config --global user.name "[name]"
$ git config --global user.email "[email address]"
启用有帮助的彩色命令行输出:
$ git config --global color.ui auto
设置git默认编辑器为vim:
$ git config --global core.editor "vim"
备注:如果当前仓库未设置user.name/user.email则采用全局的user.name/user.email,否则当前仓库的user.name/user.email会覆盖全局的user.name/user.email
创建仓库
本地创建一个仓库:
$ git init
使用以下命令将本地仓库与一个 GitHub 上的空仓库连接起来:
$ git remote add origin [url]
从远程拉取仓库下来:
$ git clone [url]
查询和追溯
git查看某次commit属于哪个分支:
$ git branch --contains <commit id> //本地分支
$ git branch -r --contains <commit id> //远程分支
问责机制,查看某一个文件是谁操作提交的:
$ git blame xxxx文件
查看分支创建以及一些操作对应的动作和时间:
$ git reflog --date=iso 分支名
查看某一个文件的提交记录:
$ git log --pretty=oneline 文件名
$ git show [commit id] //显示修改的具体修改历史
常规操作
查看当前分支状态:
$ git status
提交代码正确流程:
$ git add +要提交的文件
$ git commit -m"提交备注内容"
$ git pull 拉取远程git仓库代码 如果本地有缓存文件 建议使用 git pull --rebase(防止和别人代码冲突)
$ git push 将代码推送到远程git服务器(如果未与远程服务器建立连接 例如将本地代码推到远程dev分支 使用 git push origin/dev)
查看本地代码于远程版本代码修改内容:
$ git diff
查看当前提交git的记录:
$ git log --graph
查看分支:
$ git branch -a (远程+本地)
$ git branch 查看本地所有分支
$ git branch -r 只查看所有远程分支
重命名本地分支:
$ git branch -m oldbranchname newbranchname
基于某次tag拉新分支:
$ git checkout tag名字 -b 新分支名字
基于某次commit拉新分支:
$ git checkout commit-id -b 新分支名字
打tag相关:
$ git tag + tag名称 //给当前分支的最新提交打tag
$ git tag + tag名称 + commitid //给指定的commit 打tag
$ git tag -a tag名称 -m"备注信息"
$ git push --tag // 推送本地所有tag到远程
$ git push origin tag名称 // 推送指定tag到远程
$ git tag -d tag名称 //删除本地tag
$ git push origin --delete tag名称 //删除远程tag
本地同步远程tag,解决远程删除了tag本地还有的问题(请谨慎操作):
$ git tag -l | xargs git tag -d #删除所有本地tag
$ git fetch origin --prune #从远程拉取所有信息
一次性cherry-pick多次提交到当前分支:
$ git cherry-pick 77b37a79559191d0ecb4572df38ed70a50aff36c..8a19eef61e258072f7a56385419385ebd8a3e0d0
(不含含77b37a79559191d0ecb4572df38ed70a50aff36c提交,左开右闭规则)
git消除 ^M 的方法:
$ git config --global core.whitespace cr-at-eol
将当前本地分支跟踪远程分支状态:
$ git branch --set-upstream 本地分支名 origin/远程分支名
删除本地分支和远程分支:
$ git branch -D 要删除的本地分支名字
$ git push --delete origin 要删除的远程分支的名字
重命名本地分支和重命名远程分支:(在Git中重命名远程分支,其实就是先删除远程分支,然后重命名本地分支,再将本地推到远程)
$ git brance -m dev developer
$ git push origin developer
查看当前仓库的git远程地址:
$ git remote -v
分支合并:(https://blog.youkuaiyun.com/weixin_42310154/article/details/119004977)
$ git merge //适用于往公共分支上合代码(推荐使用Merge,方便查看历史)
$ git rebase //适用于拉公共分支最新代码(不推荐使用,虽然看起来简洁但是改变了基底,容易颠倒提交顺序)
进阶操作
本地将某次提交后的提交内容合并为一次提交:(https://blog.youkuaiyun.com/al_assad/article/details/81145856)
$ git rebase -i ff582608 //将ff582608后面的提交合并为一次
(选一次提交内容为pick, 其他都改为fixup忽略提交信息即可,保存后对commit信息不满意可以git commit --amend修改)
查看本地的git操作:
$ git reflog 可以查看本地用户对git分支的操作记录 可以选择性的回滚操作
库迁移命令:
例如将本地服务器的代码代码迁移到gitlab上(完全迁移 将所有提交记录都推上去)
$ git clone --bare git4@192.168.138.66:xxx.git //找个空位置重新拉一份远程新代码
$ git push --mirror http://192.168.138.251:xxx.git //将所有记录推到新的远程服务器
将远程分支和本地分支同步-删除远程不存在而本地git branch -a还显示的分支:
$ git remote show origin
$ git remote prune origin
撤销误commit的内容(常用于临时切换到其他分支时, 保存当前分支的修改,待切换回来后恢复改动继续编辑):
$ git reset --soft + 上一次提交的commit id
修改commit的备注提示内容:
$ git commit --amend 要修改的commit-id
(如果默认编辑器不是vim 可以使用下面的命令将编辑器设置为vim
sudo update-alternatives --config editor 选择默认的编辑器
修改完之后如果是远程分支的内容 需要 git push -f 强压上去(需谨慎操作!)
如果本地commit的,只需要继续git push 推到远程即可)
将远程回退到某一次提交(需要强压,需谨慎操作!):
$ git reset --hard <commit id>
$ git push -f origin 分支名
或者可以将版本分支回退到某一次commit,然后删除远程分支,然后再重新push origin 本地分支到远程
对比两个分支差异:
$ git log branch1...branch2 //不知道谁提交的多谁提交的少,单纯想知道有啥不一样时候使用
$ git diff branch1 branch2 --stat //显示出branch1和branch2中差异的部分
$ git diff branch1 branch2 //显示出所有有差异的文件的详细差异
$ git diff branch1 branch2 具体文件路径 //显示指定文件的详细差异
$ git log branch1 ^branch2 //查看branch1分支有,而branch2中没有的log
$ git log branch1..branch2 //查看branch2中比branch1中多提交了哪些内容
$ git log -lefg-right branch1...branch2 //在上述情况下,在显示出每个提交是在哪个分支上:
(注意 commit 后面的箭头,根据我们在 –left-right branch1…branch2 的顺序,左箭头 < 表示是 branch1 的,右箭头 > 表示是branch2的)
手动将git 的某一次提交合入到另一分支的两种方式:
方式一:(适用于同一个仓库下不同分支之间操作)
1.切到被合入的分支
2.git cherry-pick + 将要被合入分支的某次commitId (有冲突解决冲突, 解决冲突后git add 冲突文件, 最后git cherry-pick --continue)
方式二:(适用于不通仓库之间合并改动时操作)
参考https://blog.youkuaiyun.com/liuhaomatou/article/details/54410361
1.将某次的提交导出到patch文件
$ git format-patch + commitId 将这次提交之后的所有提交生成patch文件(且不包含当前提交)
2.将patch文件打入补丁
先检查patch文件:git apply --stat newpatch.patch
检查能否应用成功:git apply --check newpatch.patch
打补丁:git am --signoff < newpatch.patch(上面两个步骤可以忽略)
如果有问题可以使用:git apply PATCH --reject
git 生成 patch文件的相关命令:
$ git format-patch -M master //当前分支所有超前master的提交
$ git format-patch 4e16 --4e16指的是commit名 //某次提交以后的所有patch
$ git format-patch --root 4e16 //从根到指定提交的所有patch
$ git format-patch 365a..4e16 --365a和4e16分别对应两次提交的名称 //某两次提交之间的所有patch
$ git format-patch –n 07fe --n指patch数,07fe对应提交的名称 //某次提交(含)之前的几次提交
$ git format-patch -1 07fe //故,单次提交即为
$ git format-patch生成的补丁文件默认从1开始顺序编号,并使用对应提交信息中的第一行作为文件名。如果使用了-- numbered-files选项,则文件名只有编号,不包含提交信息;如果指定了--stdout选项,可指定输出位置,如当所有patch输出到一个文件;可指定-o <dir>指定patch的存放目录
仓库变更远程地址的两种方式:
$ vim .git/config文件,修改url //方式一
$ git remote set-url origin 新的远程git服务器地址 //方式二
git操作仓库带有子模块:
1.克隆仓库包括所有子模块:git clone --recurse-submodules https://github.com/frida/frida.git
2.子模块的定义在当前仓库的.gitmodules文件
3.如果clone时忘了下子模块或者clone所有子模块时有失败时候该怎么办 : 执行 git submodule update --init 直到没有出错信息
4.检查各子模块状态:git submodule status
5.拉取远程最新改动,包括所有子模块:git pull --recurse-submodules
6.当切换到某一个tag时,要求所有的子模块也跟着切换的命令:git checkout tagxxxx 然后 git submodule update --recursive
输出当前git仓库的分支和最新的一次commit id:(可用于写shell脚本等)
$ git symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3 //输出当前分支名
$ git rev-parse --short HEAD 2>/dev/null //输出最近一次提交的commit id