git操作
基本使用
账户设置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
ssh-keygen -t rsa -C "youremail@example.com"
在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,最后在本地进行验证
ssh git@github.com
新建仓库
mkdir test
cd test
git init #建立名为test的仓库
添加文件到暂存区
暂存区是提交到本地库之前暂留的,方便操作回退等
git add hello.c #添加单个文件
git add . #添加本地被修改过的文件(与远程仓库相比)
提交文件到本地库
git commit -m "comment"
提交文件到远程库
git push
查看仓库当前状态
查看要提交的状态,查看当前有没有需要提交的文件
git status 详细
git status -s 简要
拉取最新的代码
相当于 git fetch + git merge
git pull
拉去远程仓库时自定义本地目录名字
git clone http://github.com/repo/ newname
分支
创建及切换分支
git branch name
git checkout name
或简写为一条命令
git checkout -b name
查看分支
git branch 显示所有分支
git branch --merged 显示已经合并的分支
git branch --no-merged 显示还未合并的分支
git branch -v 显示分支当前最新的提交信息
git branch -vv 显示与远程分支之间的跟踪信息
删除分支
git branch -d name 删除已经合并的分支
git branch -D name 删除还未合并的分支(因为未合并,所以删除后分支内容会全部丢失)
git push origin --delete branch_name 删除服务器上的分支
删除文件
将文件取消跟踪并从磁盘删除
git rm filename
若之前已经修改过文件,需要强制删除
git rm -f filename
文件重命名
git mv oldname newname
相当于三条命令:
mv oldname newname
git rm oldname
git add newname
查看文件的修改状态
git diff hello.c 当前文件与上次暂存(add)之间的差异
git diff --staged hello.c 当前文件与上次提交(commit)之间的差异
进阶操作
对刚刚的commit进行修改
两次提交记录合为一次
git commit --amend
若想修改远程上的,则提交时要加–force,即git push –force
但修改远程commit会给已经pull下来的其他人带来麻烦,所以推荐开发时在新分支dev上进行
回退提交的commit
通常使用amend即可对最近的误提交进行修改,但当这次的误提交本来需要分两次进行提交时,就需要回退,然后分成两次重新提交
reset --soft会回退到之前提交,并将之后提交所做的修改保留在暂存区,当前已修改的内容不会丢失
reset --hard不会将之后提交所做的修改保留在暂存区,且当前已修改的内容全部丢失
git reset --soft HEAD^(或用commit hash指定某次commit)
HEAD^表示上一个版本,HEAD^^表示上上个版本,上100个版本为HEAD~100
变基
目的:为了使提交记录整洁,表现为当rebase后,提交记录只显示一条分支,而不是两条
使用原则:只对尚未推送给其他人的本地修改执行变基操作来清理历史,从不对已推送的提交执行变基
如将feature变基到master
git checkout feature
git rebase master
以上两条命令可以合并为一条:git rebase master feature,省去了切换分支的步骤
现在feature在master之前,所以要进行一次快进合并操作
git checkout master
git merge feature
拉取代码尽量使用
git pull --rebase
git log
查看提交的历史记录
git log --oneline --graph
仅显示那些添加或删除了该字符串的提交
git log -S string_name
查找与某个字符串相关的提交
仅显示那些添加或删除了该字符串的提交
git log -S string_name
显示所有含有此字符串文件的提交
git grep "正则表达式" $(git rev-list --all)
查看使用命令的历史记录
git reflog
放弃当前文件的修改
使文件回到最近一次git commit或git add时的状态 意思就是,把hello.c文件在工作区的修改全部撤销,这里有两种情况: 一种是hello.c自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; 一种是hello.c已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git checkout -- hello.c
.gitignore
名字后有/表示文件夹,否则表示文件
若之前已经提交了一些现在想ignore掉的文件,可以使用git rm --cached filename来排除
# 忽略所有的.a文件
*.a
# 但跟踪所有的lib.a文件,即使在之前忽略了.a文件
!lib.a
# 仅忽略当前目录下的TODO,而不忽略subdir/TODO
/TODO
# 忽略任何目录下名为build的文件夹
build/
# 忽略doc/notes.txt,但不忽略doc/server/arch.txt
doc/*.txt
# 忽略doc/目录及其所有子目录下的.pdf文件
doc/**/*.pdf
commit message tag标签
- message:
- subject主题
- body详细信息,可省略
- tag:
- git tag -a 标签名 -m “附注信息”
- 版本号的格式为 vX.Y.Z(又称 Major.Minor.Patch),递增的规则为:
- X 表示主版本号,当 API 的兼容性变化时,X 需递增。
- Y 表示次版本号,当增加功能时(不影响 API 的兼容性),Y 需递增。
- Z 表示修订号,当做 Bug 修复时(不影响 API 的兼容性),Z 需递增
给之前的commit打标签
git tag -a xx -m xx commit_hash
git stash
暂存当前工作(包括修改的和add的)而不提交,然后再去做别的事情,如到另一分支工作
-
暂存:
git stash save "message"- 实际应用中推荐给每个stash加一个message,用于记录版本,使用git stash save取代git stash命令
-
查看:
git stash list -
恢复
git stash pop:将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下git stash apply:将缓存堆栈中的stash应用到工作目录中,但并不删除stashgit stash apply stash@{0}:通过名字指定使用哪个stash
-
移除
git stash drop stash@{0}:删除指定stashgit stash clear:删除所有
-
查看stash的diff
git stash show stash@{0} -p
git cherry-pick
将指定的提交(commit)应用于其他分支
git cherry-pick commit-hash
git add -p
可查看每个文件的更改并决定是否将此文件进行add
git submodule
git submodule update 从自己仓库中的module拉取更新 git submodule update –remote 从module原本所在的远程仓库中拉取更新