文章目录
配置
- 别名
在~/.gitconfig
中加入下面几行,可以使用更短的命令名字:[alias] st = status ci = commit co = checkout br = branch
- 解决显示中文乱码的问题
$ git config --global core.quotepath false # 显示 status 编码 $ git config --global gui.encoding utf-8 # 图形界面编码 $ git config --global i18n.logoutputencoding utf-8 # 输出 log 编码
分支管理
- 本地创建分支,并提交到远程
git checkout -b new_branch git push -u origin new_branch # -u 即为 --set-upstream
- 修改分支名字
git branch -m old_branch new_branch # Rename branch locally. 如果当前就在old_branch上,可以省略old_branch. git push origin :old_branch # Delete the old branch git push --set-upstream origin new_branch # Push the new branch, set local branch to track the new remote
回退
- 将某个特定文件回退到上一个版本:
git checkout HEAD~1 file1/to/restore
- 临时退回上一个版本测试(将处于detached head状态)
再恢复回来:git checkout HEAD~1
git checkout master
Stash
- 将单个文件从stash中恢复
$ git diff stash@{0} HEAD # 比较最近的缓存与当前版本 $ git diff stash@{0} HEAD -- file_name # 比较特定的文件 $ git checkout stash@{0} -- <filename> # 恢复特定的文件
ref: https://stackoverflow.com/questions/1105253/how-would-i-extract-a-single-file-or-changes-to-a-file-from-a-git-stash
比较stash与HEAD
比较最新的Stash与HEAD,在cmder里不能加{0}:
git difftool stash HEAD
根本原因是终端把大括号{}吃掉了,StackOverflow这里列出了各种解决办法,但似乎在win10+cmder的机器上都不好用。只能用上面这种办法。
Commit
- 将别人的commit cherry-pick下来,修改后再提交,需要修改提交者的名字
git commit --amend --author="your name <your_email@mail.com>"
拉取部分代码
# 初始化
git init
# 添加源
git remote add origin $CLONE_ADDRESS
# 配置sparsecheckout为true
git config core.sparsecheckout true
# 把要拉取的文件目录skynet以及所有的*.sh文件加入到.git/info/sparse-checkout文件中
echo skynet >> .git/info/sparse-checkout
echo *.sh >> .git/info/sparse-checkout
# 拉取文件
git pull origin master
使用meld
作为difftool工具
git difftool使用GUI diff程序(即Meld)显示diff,而不是在终端中显示diff输出。
# Add the following to your .gitconfig file.
[diff]
tool = meld
[difftool]
prompt = false
[difftool "meld"]
cmd = meld "$LOCAL" "$REMOTE"
[注意:这些设置不会改变git diff的行为,它会继续像往常一样工作。]
作为mergetool工具
git mergetool允许您使用GUI合并程序(即Meld)来解决合并期间发生的合并冲突。
# Add the following to your .gitconfig file.
[merge]
tool = meld
[mergetool "meld"]
# Choose one of these 2 lines (not both!) explained below.
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
使Meld忽略尾随空格
忽略尾随空白通常非常有用,尤其是在协作时,可以在Meld首选项文本过滤器选项卡中使用简单的Python正则表达式轻松手动添加。
# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$
参考:https://codeday.me/bug/20180109/116253.html
添加meld右键菜单
如果想在git环境以外比较两个文件,也可以用meld,方法是:
- 新建一个meld的快捷方式(找到meld.exe,右键->新建桌面快捷方式),
- 在资源管理器中输入shell:sendto,打开“发送到”的文件夹,
- 将刚刚的meld快捷方式拖到这个目录中,大功告成,
- 使用的时候,选择两个要比较的文件,右键->发送到,这时就可以看到有meld的选项了。
参考:https://www.howtogeek.com/howto/windows-vista/customize-the-windows-vista-send-to-menu/
创建ssh仓库
小团队协作时,可以在一台安装了openssh-server的Linux服务器上配置git仓库,方便协作。方法分两步:1)在服务器上建立仓库容器;2)本地建立仓库并推到远端
服务器上建立仓库容器
- 到~目录下:
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
- 将本地的id_rsa.pub中的内容复制到服务器的authorized_keys,即添加了本地主机到信任列表。
- 在服务器上建立仓库容器:
cd ~
mkdir git_repo && cd git_repo
git init --bare
本地建立仓库并推到远端
- cd到代码所在目录
- 初始化仓库并推到远端:
git init
git add *.m
git commit -m "init"
git remote add origin ssh://yourname@server_ip:/~/git_repo
git push origin master
服务器上拉取代码
服务器上拉取代码就简单了,因为其实就是在本地拉取:
git clone ~/git_repo