git 学习笔记
最近从 svn 转到 git。这两个版本控制系统区别蛮大的,还是有点不适用。做个笔记,记录 git 的各种常用操作。算是给自己做个备忘。
git 使用前的配置
首先要设置自己的用户名和邮箱名。
git config --global user.name "your name"
git config --global user.email "your email address"
然后最好再设置一下提交 comment 时用的文本编辑器。(默认是 vi)
git config --global core.editor "notepad++.exe" # 我习惯用 notepad++ , 大家可以根据自己的习惯设置合适的编辑器。
让 git 输出的文字显示不同的颜色。
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto
查看各种配置情况:
git config --list
生成 ssh 公钥
这项操作其实和 git 无关,属于是 ssh 的配置了。不过 git 会用到 ssh 来传输数据。所以还是需要配置一下。
ssh-keygen -t rsa -C “您的邮箱地址”
cd ~/.ssh # 这时会生成这个目录,公钥就放在这个目录里。
ls # 这时会看到 这两个文件:id_rsa id_rsa.pub,id_rsa.pub 就是公钥
生成一个代码仓库
生成一个代码仓库有两种方式,自己建一个或者从远程仓库中克隆一个。
git init # 在当前目录中生成一个代码仓库
git clone url # 克隆一个代码仓库到本地
git clone url path # 克隆一个代码仓库到本地,放在 path 目录中。
文件操作
git add path # 添加文件或目录到代码仓库
git rm path # 从代码仓库和工作目录中删除文件或目录
git rm --cached path # 从代码仓库删除文件或目录,本地还保留
git mv path destination # 文件改名
git checkout [rev] file # 签出某一个版本的文件。如果不加 rev 则签出最新的。
working tree 相关的操作
git status # 显示当前工作目录的状态
git add path # 将文件暂存
git commit # 将暂存的文件提交到版本库中。
git commit -a # 将所有修改后的文件都提交到版本库中。
git commit --amend # 撤销最近一次提交操作。
git reset HEAD <file> # 撤销对 file 的暂存。
git checkout -- <file> # 将 file 恢复到版本库中的样子。(丢弃对 file 的修改)
git checkout -- # 将所有文件恢复到版本库中的样子。
git clean # 将工作目录中非版本控制的文件删除
比较文件的差异
git diff # 当前文件和暂存区域快照之间的差异。
git diff --cached # 暂存起来的文件和上次提交时的快照之间的差异。
git diff --staged # 暂存起来的文件和上次提交时的快照之间的差异,与 git diff --cached 相同。
忽略某些文件
有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。下面是一个 .gitignore 的例子。
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
本地分支
git branch branch_name # 建立一个名为 branch_name 的分支
git checkout branch_name # 将工作目录切换到 branch_name 分支的最新版
git checkout -b branch_name # 新建一个名为 branch_name 的分支,并将工作目录切换到 branch_name 分支(HEAD 指向 branch)
git branch -d branch_name # 删除分支 branch_name
git branch -D branch_name # 强制删除分支 branch_name
git branch # 显示所有本地的分支
git branch -v # 查看各分支最近一次提交对象的信息
git branch --merge # 查看那些分支是当前分支的直接上游
git branch --no-merged # 查看那些分支尚未尚未合并到当前分支
git branch -f branch rev # 用 rev 覆盖当前分支
git merge branch_name # 合并分支,将 branch_name 和当前分支合并
远程仓库的操作
git clone url # 克隆一个代码仓库到本地
git clone url path # 克隆一个代码仓库到本地,放在 path 目录中。
git remote -v # 显示远程仓库的信息
git remote add [shortname] [url] # 添加一个新的远程仓库,并给远程仓库指定一个 shortname
git fetch [remote-name]# 从远程仓库抓取数据到本地.
git pull [remote-name] # 从远程仓库抓取数据到本地,然后将远端分支自动合并到本地仓库中当前分支。
git push repository_name local_branch_name: remote_branch_name # 将本地的分支 local_branch_name 推送到远程仓库,成为名为 remote_branch_name 的远程分支
git push repository_name local_branch_name # 将本地的分支 local_branch_name 推送到远程仓库,建立一个同名的分支
git merge repository_name/remote_branch_name # 将远程分支 remote_branch_name 合并到本地的当前分支上。
git checkout -b local_branch_name repository_name/remote_branch_name # 建立一个本地分支 local_branch_name,与远程分支 remote_branch_name 关联。
git checkout --track repository_name/remote_branch_name # 建立一个同名的本地分支 remote_branch_name,与远程分支 remote_branch_name 关联。
git push repository_name :remote_branch_name # 删除远程分支 remote_branch_name
git remote show [remote-name] # 查看远程仓库 remote-name 的详细信息
git remote rename oldname newname# 将远程仓库 oldname 改名为 newname
git remote rm name # 删除与远程仓库 name 的关联
打标签
git tag # 列显已有的标签
git tag name [revision] # 给 revision 打一个轻量级标签。
git tag -a name [revision] -m "your comment" # 给 revision 打一个含附注的标签。
git tag -s name [revision] -m "your comment" # 给 revision 打一个含附注的标签,并用用 GPG 来签署标签。
git push origin [tagname] # 分享标签到远端仓库
git push origin --tags # 推送所有本地新增的标签到远端仓库
Git 命令别名
git 支持我们给命令起个别名。下面是一些例子。
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual '!gitk'