文章首发于 http://blog.csdn.net/xianda9133/article/details/78121349
本文作为自己的笔记留存。从安装到基本使用,满足日常的需求。
大家想系统学习我推荐这个:史上最浅显易懂的Git教程!
或者阅读官方教程,中文的。
Git安装配置
下载安装git-for-windows
在windows安装时选择如下选项:
- Use Git from Git Bash only
- Use the OpenSSL libriary
- Checkout as-is,commit as-is
- Use MinTTY
- 其他默认即可
安装路径建议为C:/Git/
或者D:/Git/
。
使用之前可在git安装目录新建名为home
的文件夹。并将此路径添加到环境变量HOME
中,添加到用户变量即可。这样在使用git时产生的所以配置文件均会保存到此目录中,并且加快git bash
的启动速度。
否则环境变量中无HOME
的变量,则会将配置信息以及生成的ssh密钥保存在当前登录用户的根目录,比如C:/Users/administrator/
。
常用命令
初始化git版本库
git init
克隆版本库
git clone <dir>
配置联网的代理服务器
bash的ssh
命令可在~/.ssh/config
文件中配置如下一行,即可测试ssh -T git@github.com
ProxyCommand connect -H xxxx:8080 %h %p
配置git
命令使用代理
git config --global http.proxy http://xxxx:8080
git config --global http.proxy user:password@http://xxxx:8080 # 需验证用户密码时这样写
git config --global https.proxy http://xxxx:8080 # 设置git访问https协议所使用的代理
git config --get http.proxy # 检查是否设置成功
git config --global http.sslVerify false # 解决https证书错误的问题
# 经测试,在内网环境使用代理后使用 git协议 (git@github.com:xxx...) 无法依然使用,需要修改为 https 协议,每次push都需要输入账户密码,比较麻烦
git config --global credential.helper wincred # 设置使用window凭据缓存账号密码,用于https方式push
# 当前git bash窗口有效
export http_proxy="http://127.0.0.1:8087"
export https_proxy="http://127.0.0.1:8087"
# cmd 代理设置
set http_proxy=http://proxy.yourname.com:8080
set http_proxy_user=
set http_proxy_pass=
取消git联网的代理服务器
git config --global --unset http.proxy
ssh的说不好是什么的配置
编辑~/.ssh/config
文件,添加如下内容
Host github.com
Port 443
User git
Hostname ssh.github.com
PreferredAuthentications publickey
identityfile ~/.ssh/id_rsa
ProxyCommand connect -H PROXY_HOST_IP:PORT %h %p
用于在内网环境下ssh使用代理通过https协议与github。
配置用户名和邮箱
git config --global user.email "You@example.com"
git config --global user.name "Your Name"
添加远程仓库
git remote add origin git@github.com:youname/yourrepo.git
添加文件
git add <filename>
git add . # 添加所有文件
提交
git commit -m '<comment>'
git commit -am '<comment>' # 若无增删文件,可这样使用,代替`git add .`&`git commit -m '<comment>'`
如果忘了加-m
参数,会进入到linux的vim编辑界面,在输入了comment后按ESC
,输入:wq
按回车即可。
git commit --amend --date="commit_time" # 修改上一次的提交时间
# commit_time的格式可以执行date -R来查看。若修改上一次时间为当前时间,可执行:
git commit --amend --date="$(date -R)" 或
git commit --amend --date=`date -R`
# 其他时间自己构造即可:
git commit --amend --date="Sun, 25 Dec 2016 19:42:09 +0800"
git commit --amend --date="$(date -d '2018-02-02 18:15:15' -R)"
查看状态
git status # 在任何环节均可以查看状态。
查看所有分支
git branch --all
新建分支
git checkout -b <branch>
等同于:
git branch <branch>
git checkout <branch>
git 本地分支与远程分支关联
1) github上已经有master分支 和dev分支
git checkout -b dev # 新建并切换到本地dev分支
git pull origin dev # 本地分支与远程分支相关联
2) 在本地新建分支并推送到远程
git checkout -b test
git push origin test # 这样远程仓库中也就创建了一个test分支
发布dev分支
发布dev分支指的是同步dev分支的代码到远程服务器,与新建分支并推送类似
git push origin dev:dev # 这样远程仓库也有一个dev分支了
在dev分支开发代码
git checkout dev # 切换到dev分支进行开发
# 开发代码之后,我们有两个选择
# 第一个:如果功能开发完成了,可以合并主分支
git checkout master # 切换到主分支
git merge dev # 把dev分支的更改和master合并
git push # 提交主分支代码远程
git checkout dev # 切换到dev远程分支
git push # 提交dev分支到远程
# 第二个:如果功能没有完成,可以直接推送
git push # 提交到dev远程分支
# 注意:在分支切换之前最好先commit全部的改变,除非你真的知道自己在做什么
删除分支
git push origin :dev # 删除远程dev分支,危险命令哦
# 下面两条是删除本地分支
git checkout master # 切换到master分支
git branch -d dev # 删除本地dev分支
标签
git tag # 查看标签
git tag -l 'v1.4.2.*' # 搜索特定模式列
git tag -a v1.4 -m 'my version 1.4' # 添加标签 -a 标签名字 -m 标签说明
git show v1.4 # 查看标签版本信息
git tag v1.4-lw # 直接给出标签名称 创建轻量标签
git tag -v [tag-name] # 验证已经签署的标签 (git tag -s v1.4)
git tag v1.2 9fceb02 # 对早先的某次提交加注标签
git push origin --tags # 推送所有标签 默认 git push 不会推送标签到远端
git tag -d v1.4-lw # 删除标签
其他命令
git push -u origin master
git log
git reflog
ssh-keygen -t rsa -C "yxd9721@qq.com"
彻底删除某个文件的历史记录
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch FILE_PATH' --prune-empty --tag-name-filter cat -- --all
git push origin master --tags --force
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
把FILE_PATH
替换成要删除的文件,执行即可。
修改历史提交数据
用git filter-branch
命令,该命令会在当前分支的所有提交上上执行参数所描述的操作。如果你要在所有分支的所有提交上执行,可以在后边加上--all
选项。也可参考上面彻底删除某文件历史记录的命令参数。
比如,你想修改你的邮箱为新的邮箱 :
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "old@example.com" ];
then
GIT_AUTHOR_NAME="NEW NAME";
GIT_AUTHOR_EMAIL="NEW_Email@example.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
一些alias
可将下面的配置手动保存到~/.gitconfig
文件中
[alias]
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
lgg = log --no-merges --color --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit
ls = log --no-merges --color --stat --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit
效果等同于执行:
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 config --global alias.lgg log --no-merges --color --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit
git config --global alias.ls log --no-merges --color --stat --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit
使用github.com
设置ssh key
// 1. 创建 ssh key,出现提示一路按回车
ssh-keygen -t rsa -b 4096 -C "thianda91@outlook.com"
// 2. 让 ssh-agent 在后台运行 (start the ssh-agent in the background)
eval $(ssh-agent -s)
// 3. 指定密钥给本地ssh-agent
ssh-add ~/.ssh/id_rsa
// 4. 复制公钥,然后粘贴到github->Setting->SSH and GPG keys->New SSH key
clip < ~/.ssh/id_rsa.pub
// 5. 验证ssh key
ssh -T git@github.com
使用方法
在git-bash中使用ssh协议的链接进行clone和push,即可基于ssh key免输密码。
设置启动git bath后自动运行ssh-agent
将下面的代码保存到~/.profile
或者 ~/.bashrc
,~
表示当前用户的用户目录。或者是前文提到的新建的home
文件夹。
env=~/.ssh/agent.env
agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
agent_start () {
(umask 077; ssh-agent >| "$env")
. "$env" >| /dev/null ; }
agent_load_env
# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
agent_start
ssh-add
# 若要 ssh-agent 运行一段时间后自动停止,可将上面一行改成 ssh-add -t <seconds>
# 比如本人设置成了 ssh-add -t 1800
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
ssh-add
fi
unset env
详细讲解:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
图片来自: 廖雪峰的官方网站
点“Add Key”,你就应该看到已经添加的Key。
参考
generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
adding-a-new-ssh-key-to-your-github-account
working-with-ssh-key-passphrases
CMD 和 Git 中的代理设置