Git常用命令小结
- git branch [name] //创建本地分支
- git checkout [name] //切换本地分支
- git add -u //只把修改的文件添加到索引库
- git fetch //下载最新项目并且比较与最新项目的不同
- git --help //查看帮助文档
- git reset --hard //重置代码到分支之前的状态
- git rebase [branchname] //合并分支(eg:git rebase orign/master)
- git reset --hard commit_id //撤销commit到提交的id
- git tag -a v1.3 -m 修复xxxx //当前分支打标签
- git push --tags //推送所有本地tag到远程服务器
- git branch -m oldname newname //重命名本地分支
- git push --delete origin branchname //删除远程分支
- git commit --amend //修改commit的内容
- git rm -rf --cached . //删除已经add,但是没有commit的文件,只会移除git记录,不会删除真实文件
Git 默认初始化分支
# vim ~/.gitconfig
[init]
defaultBranch = main
修改本地未提交的日志commit message
情况一:最后一次提交且未push
git commit --amend
情况二:旧的提交且未推送
假设commit是倒数第3次提交,这个可以使用git log查看
$ git log
commit b1b451d218cc23b6c769f373164f2b89cf54d0aa
Author: clcaza <clcaza@sina.cn>
Date: Sat Mar 10 19:09:08 2018 +0800
add :添加内容d
commit 04f0d1809d5d31cc6e930efcba47a5f3f7e93319
Author: clcaza <clcaza@sina.cn>
Date: Sat Mar 10 19:08:24 2018 +0800
add: 添加内容c
commit 94fc8feb916442d56b558d5c370f18f057298921
Author: clcaza <clcaza@sina.cn>
Date: Sat Mar 10 19:07:08 2018 +0800
添加内容a
commit fd517efa9faf6a5ec71d0eac38fbcfa0cd689f40
Author: clcaza <clcaza@sina.cn>
Date: Sat Mar 10 19:06:21 2018 +0800
git rebase -i fd517efa9faf6a5ec71d0eac38fbcfa0cd689f40
它会打开一个编辑器,它会把最后前3次的提交显示出来,类似于:
pick 94fc8fe 添加内容a
pick 04f0d18 添加内容c
pick b1b451d 添加内容d
你会看到,它是按提交的顺序显示的,与git log显示的顺序相反。定位到你要编辑日志的那一行,把pick修改为edit,然后保存。
接着就是修改日志内容了
git commit --amend
完成编辑日志后,记得执行:
git rebase --continue
Rebase目的是打开提交的历史记录,让您选择要修改的内容。 Git会让你在一个新的分支修改内容。 git rebase --continue则是让你重新回到之前的分支。
修改远程仓库
- git remote rm origin
- git remote add origin git@git.oschina.net:fuwenjiang/FirstGit.git
##本地分支与远程分支关联
git branch --set-upstream-to origin/devtest devtest
删除已经提交的文件
git rm -r --cache *.bak
git 多个commit合并
git rebase -i HEAD~2
1.表示合并最近的2个提交
pick b76d157 b
pick a931ac7 c
# Rebase df23917..a931ac7 onto df23917
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
2.把pick修改成squash就可以去掉这个commit,合并到其他commit中了
Git整体配置命令小结
git config --global user.name "Your Name Here"
git config --global user.email your@email.com
#Git pull默认加上rebase功能
git pull时可以加上–rebase参数, 使之不产生Merge点, 保证了代码的整洁, 即: git pull --rebase
但每次都加–rebase似乎有些麻烦,我们可以指定某个分支在执行Git pull时默认采用rebase方式
$ git config branch.dev.rebase true
请使用以上命令时将 “dev” 修改成您自己本地的分支名字.
提示:
必须cd到你工程的目录下,才能更改分支的配置;
可以使用 git branch 命令, 列出您当前仓库中的所有本地分支;
如果你觉得所有的分支都应该用rebase,那就设置:
$ git config --global branch.autosetuprebase always
这样对于新建的分支都会设定上面的rebase=true了。已经创建好的分支还是需要手动配置的。
Git全局配置命令小结
- 查看Git全局配置信息
git config -l
- 提交代码的log里面会显示提交者的信息
git config --global user.name [username]
git config --global user.email [email]
- 配置git编辑器
git config --global core.editor notepad++
- 配置git比较工具
git config --global merge.tool vimdiff
- 在git命令中开启颜色显示
git config --global color.ui true
- 在git add解决乱码问题
(eg:会显示形如274\232\350\256\256\346\200\273\347\273\223.png的乱码)
git config --global core.quotepath false
- 配置几个常用的log命令
git lg1 和 git lg2 两条 命令,可以比较方便的查看 commit。
$ vim ~/.gitconfig
## insert
[alias]
lg1 = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' -10 --all
lg = !"git lg1"
注意:-10 代表最近的十条 ;–all代表所有分支
Using WinMerge as the git Diff/Merge Tool on Windows 64bit
[mergetool]
prompt = false
keepBackup = false
keepTemporaries = false
[merge]
tool = winmerge
[mergetool "winmerge"]
name = WinMerge
trustExitCode = true
cmd = "/c/Program\\ Files\\ \\(x86\\)/WinMerge/WinMergeU.exe" -u -e -dl \"Local\" -dr \"Remote\" $LOCAL $REMOTE $MERGED
[diff]
tool = winmerge
[difftool "winmerge"]
name = WinMerge
trustExitCode = true
cmd = "/c/Program\\ Files\\ \\(x86\\)/WinMerge/WinMergeU.exe" -u -e $LOCAL $REMOTE
ARC命令小结
- arc diff Review代码
- arc land Review通过后提交代码(建议在提交前先git fetch一次解决冲突)
产生密钥#
Mac用户打开 Terminal,Windows用户打开 Git Bash。
首先检查是否有密钥存在:
$ ls -al ~/.ssh
如果你看到了类似下面的结果,说明已经有密钥了,直接前往第三步
id_dsa.pub
id_ecdsa.pub
id_ed25519.pub
id_rsa.pub
执行以下命令创建密钥:
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# coding 专用
ssh-keygen -m PEM -t rsa -b 4096 -C "your_email@example.com"
程序会提示选择密钥保存位置,直接按回车选择默认地址即可。
接下来需要输入密钥的密码。
当你看到类似这样的文字,就成功啦:
Your identification has been saved in /Users/you/.ssh/id_rsa.
Your public key has been saved in /Users/you/.ssh/id_rsa.pub.
The key fingerprint is:
01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com
添加密钥
找到刚才生成密钥目录的 id_rsa.pub (注意.pub)文件,把它的正文复制出来,你可以使用如下命令复制:
$ pbcopy < ~/.ssh/id_rsa.pub (Mac用户)
$ clip < ~/.ssh/id_rsa.pub (Windows用户)
然后访问项目中需要密钥的位置,填写一个合理的名字,并把密钥粘贴到里面即可。
辅助命令:
# 查看公钥的MD5
ssh-keygen -l -E md5 -f id_rsa.pub
# 查看RSA 公钥指纹
ssh-keygen -lf id_rsa.pub
#提交统计相关
###仓库提交者排名前 5(如果看全部,去掉 head 管道即可):
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
效果:
160 xiaoming
56 xiaohong
45 ceshi
43 开发
###仓库提交者(邮箱)排名前 5:这个统计可能不会太准,因为很多人有不同的邮箱,但会使用相同的名字
git log --pretty=format:%ae | gawk -- '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }' | sort -u -n -r | head -n 5
结果
160 xiaoming@163.com
56 9797979797@qq.com
45 kaixin@163.com
43 thisisaname@163.com
###贡献者统计:
git log --pretty='%aN' | sort -u | wc -l
结果:
6
###提交数统计:
git log --oneline | wc -l
结果
324
git不区分文件名大小写问题
例如将README.md文件修改为readme.md,提交到仓库,发现没有任何改动可以提交,这是因为Git 默认对于文件名大小写是不敏感的。
使用以下命令来配置 Git 使其对文件名大小写敏感:
git config core.ignorecase false
此时提交会显示改动信息。
但是当你提交上去后,发现本地仓库没有任何改变,但是远程仓库的大写的文件README.md和小写的文件readme.md同时存在在远程仓库了。
此时clone和pull下来的文件却只有readme.md
最终的办法是先删除再添加,然后提交:
备份文件
删除文件git rm README.md(会把readme.md文件删掉)
把备份文件放入
添加文件git add README.md
提交git commit “…”、git push