目录

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的)而不提交,然后再去做别的事情,如到另一分支工作

  1. 暂存:git stash save "message"

    • 实际应用中推荐给每个stash加一个message,用于记录版本,使用git stash save取代git stash命令
  2. 查看:git stash list

  3. 恢复

    • git stash pop:将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下
    • git stash apply :将缓存堆栈中的stash应用到工作目录中,但并不删除stash
    • git stash apply stash@{0}:通过名字指定使用哪个stash
  4. 移除

    • git stash drop stash@{0}:删除指定stash
    • git stash clear:删除所有
  5. 查看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原本所在的远程仓库中拉取更新