与SVN的区别
git为分布式相对于svn为集中式,git可以很容易的创建分支,克隆文本代码,离线也可现在本地分支提交修改。
但是git相对于svn要记住很多命令,入门相对复杂。
四度空间
在Git仓库目录下的文件改动(增删改操作)共有如下4个空间来记录/存储,Git命令就是用于将文件改动切换到不同的空间来记录。
- Workspace:工作区
- Index / Stage / Cached:暂存区
- Repository:本地仓库
- Remote:远程仓库
四种状态
对应四度空间,处于这四种空间的文本有着4种状态来标识:
- Untracked:新增的文件的状态,未受Git管理,记录在工作区
- Modified:受Git管理过的文件的改动状态(包括改动内容、删除文件),记录在工作区
- Staged:将记录在工作区的文件变动状态通知了Git,记录在暂存区
- Unmodified:受Git管理中的文件状态(没有变动),记录在本地仓库/远程仓库
连接
初始化:
git init
添加远程仓库:
git remote add origin “url”
生成公钥:
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub 添加到github配置
查看配置列表:
git config –local –list
克隆远程分支:
git clone “url”
文件加入暂存区:
git add
提交到本地分支:
git commit -m “注释”
推送到远程仓库:
git push -u origin master
过滤
touch .gitignore
1 | #过滤具体文件demo.o |
- 以斜杠“/”开头表示目录
- 以星号“*”通配多个字符
- 以问号“?”通配单个字符
- 以方括号“[]”包含单个字符的匹配列表
- 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录
变动
查看文件改动状态:
git status
查看文件具体改动:
git diff file
查看暂存区的改动:
git diff –cached
查看工作区与本地仓库的改动:
git diff HEAD file
查看历史变更:
git diff commitID1 commitID2
查看本地分支与远程分支的改动
git diff origin/master..master
转移
添加文件到暂存区:
git add file
git add -A /app
git add *
将文件退回工作区:
git rm –cache file
直接删除:
git rm -f file
文件重命名:
git mv fileold filenew
文件移动位置:
git mv [src file] [dir]
提交
将暂存区内容提交:
git commit -m “注释”
追加提交并修改注释:
git commit –amend -m “新注释”
将工作区和暂存区的改动一次提交到本地仓库:
git commit -a -m “注释”
补丁
将本地提交打补丁,可以交由他人继续开发:
git format-patch -1 commitID
git format-patch HEAD~3
应用补丁包:
git am 补丁包名
日志
标准日志:
git log
精简查看:
git log –pretty=oneline
完整查看:
git log -p
工具查看:
gitk
查看本地历史操作:
git reflog
缓存
缓存本地改动:
git stash save -a “add test stash0()”
查看所有缓存:
git stash list
查看缓存细节:
git stash show -p stash@{1}
启动某个缓存:
git stash pop stash@{1}
丢弃某个缓存:
git stash drop stash@{1}
清空缓存:
git stash clear
回退
回退到某个版本,只回退了commit的信息,不会恢复到index file一级:
git reset –-soft
彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉:
git reset -–hard
回退到某个版本,回退了commit的信息及暂存区的回退,工作区不回退
git reset –mixed
清理
撤销不能管理到未加入到git的文件,这时需要git clean配合。
git reset –hard
git clean -df
这样可以做到完全清理。
撤销
撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交。
撤销前一次 commit:
git revert HEAD
撤销前前一次 commit:
git revert HEAD^
撤销指定的版本:
git revert commit
分支
查看分支:
git branch
创建分支:
git branch
切换分支:
git checkout
创建+切换分支:
git checkout -b
合并某分支到当前分支:
git merge
删除分支:
git branch -d
禁用Fast forward:
git merge –no-ff -m “merge with no-ff” dev
由远程分支创建本地分支:
git checkout -b branch-name origin/branch-name
建立本地分支和远程分支的关联:
git branch –set-upstream branch-name origin/branch-name
git pull/get fetch
git fetch和git pull都可以将远端仓库更新至本地,不过git pull相当于git fetch + git merge。
在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支:
git fetch origin master:tmp
来比较本地代码与刚刚从远程下载下来的代码的区别:
git diff tmp
合并temp分支到本地的master分支:
git merge tmp
如果不想保留temp分支,可以用这步删除:
git branch -d temp
挑拣
在当前分支挑其他分支的 commit,把那部分的变动那过来:
git cherry-pick commit-sha1
支持一次性拿多个:
git cherry-pick master4 master2
支持区间, 区间中间:
git cherry-pick startGitSha1..endGitSha1
- continue:继续 pick,一般有冲突解决后才需要这样
- skip:跳过这次进入队列下一次行为
- abort : 完全放弃 pick,恢复 pick 之前的状态
- quit: 未冲突的自动变更,冲突的不要,退出这次 pick
变基
整个功能开发完毕的时侯,会有非常多的 commit,用 rebase 可以让我们的commit记录很干净。
带 -i 可以进入交互模式,效果如下:
git rebase -i git-sha1|branch(HEAD)
若是中间毫无冲突,变基则一步到位,否则需要逐步调整
提交变更后继续变基下一步:
git rebase –continue
引起冲突的commits会被丢弃,continue提示没有需要改动的也可以用这个跳过:
git rebase –skip
若是变基改残废了,但是走到一半,可以彻底回滚变基之前的状态:
git rebase –abort