前言:参考教程廖雪峰《GIT教程》,参考视频B站《深入掌握Git与实战开发》
gitignore文件
在git 操作中,由于每个开发者拥有不同的工程文件,因此这些工程文件是不需要纳入版本控制系统中的。
使用步骤:在 git 目录下添加.gitignore文件,将需要自己屏蔽的文件添加到该文件中。
如在当前目录下有:a.setting , a.project,b.project 文件。
echo “ a.setting \n *.project \n !a.project” > .gitignore
然后git不会对a.seeting ,b.project的追踪,但是会对a.project文件进行追踪。
设置相关忽略文件:
*.a #忽略所有以.a结尾的文件。
!lib.a #但是lib.a除外
/TODO #仅仅忽略项目根目录下的TODO文件,不包括subdir/TODO
build/ #忽略build/目录下所有文件
doc/*.txt 忽略doc目录下所有*.txt文件
基本操作
工作区:就是你电脑能看到的目录。
版本库:工作区有个隐藏的目录“.git”,这个不算工作区,而是git的版本库。
暂存区:需要提交的文件统统放到暂存区。
分支:一个commit对象链,一个工作记录线。
git add . //将当前目录下所有文件(不包括.gitignore修饰的文件)添加到版本库
git add –u //将已纳入版本库的文件进行add
git add * //添加当前目录下所有文件
HEAD:指向的是当前的分支。
master:指向提交
dev: dev分支 git checkout –b dev
git rm
等价于
rm
git checkout --
git reset HEAD
git rm –cached xxx //将文件从版本库中移除,但文件仍保留在版本库中
重命名:git mv a.txt a.txt (推荐使用)=> mv a.txt b.txt git add b.txt (操作繁琐)
git config –local user.name “mouchengdeng”
git config –local user.email [email protected]
git相关配置文件:
/etc/gitconfig --system
~/.gitconfig -global
.git/config --local
官方网站:git-scm.com
git图形化界面按:gitk
git合并遵循的原则:三方合并原则
git cherry-pick commitId将某个分支的修改信息应用到另外一个分支上。
stash暂存与取出
git stash //保护现场
git stash list
git stash pop
git stash apply stash@{0}
标签
在开发到达一个历史性的阶段时,打一个Tag,它是一个指针,没有和分支挂钩。
新建轻量级标签:git tag v1.0.1
新建一个带附注的标签:git tag –a v1.0.2 –m “release version”
删除标签:git tag –d tag_name
恢复到标签:git reset --hard tag_name
差异比较
暂存区与工作区的差异比较(src 暂存区,dest工作区):git diff
diff --git a/a.txt b/a.txt #a为暂存区,b为工作区
index f73a649..fcb2bab 100644
--- a/a.txt # ---- 代表源文件
+++ b/a.txt # ++++代表目标文件
@@ -1,6 +1,6@@ #源文件从第一行开始,后面还有4行。目标文件:从第一行开始,后
#面有三行。
-add
c++
c
java
+abc
总体大意为:在源文件 –add,+abc就等于目标文件
某个提交(src)与工作区(dest)的差异比较:git diff commit_id
暂存区与某个提交的差异比较:git diff –cached commit_id
git diff –cached :比较暂存与最新提交的比较。
git diff HEAD --- xxx : 查看最新提交与工作区之间的差异
两个提交之间的比较:git diff commit_id commit_id
git远程与github
git push :推送,在2.0以前推送到远程相同的分支,在2.0以后推送git pull那个分支。(若push失败,很有可能冲突了,需现pull ,手工合并,然后再次push)
git pull :拉取并合并
pull = fetch + merge
github:全球开源仓库
gitlab: 公司内网使用的git远程仓库
git remote add origin http:www.xxxxx/xxx.git //origin远程仓库的别名,代表url地址
git push –u origin master //将本地分支与远程分支进行关联并提交
git remote show //查看远程关联的仓库
ssh,https,http:常用ssh,第一次push需将公钥放置在githab仓库上
remote/origin/master (远程分支,对应远程master分支):如何进行比较,如何进行匹配,判断谁先谁后。git push :1改变remote/origin/master指向,2将代码推送到远程
git push操作完整命令: git push origin srcBranch : destBranch //如:git push origin master:master
git pull操作完整命令: git pull origin srcBranch : destBranch
git remote rm origin //删除远程仓库
git remote add origin url //添加远程仓库
分支操作
git branch newBranchName //创建一个新的分支
git checkout BranchName //切换到选种的分支
git branch –d BranchName //删除分支
git branch –v //查看所有分支
git checkout –b develop //创建分支并切换到该分支
git checkout –b develop /origin/develop //**** 并与远程分支对应
git push origin :develop //将远程分支删除
git push origin –delete develop //将远程分支删除
git push –set-upstream origin develop //创建远程分支
基于Github分支开发操作的操作模型:
merge冲突
1<<<<<<< HEAD
2 in master
3 =======
4 in dev
5 >>>>>>> dev
解释:在相同行中,HEAD(当前)分支内容为“in master”,在dev分支内容为“in dev”。如需要保存当前分支内容,则将第1,2,3,5行删除,只保留第4行的内容。
变量别名
变量别名设置: git config --global alias.br branch //生成的相关文件在~/.gitconfig中
git branch –av => git br –av
相关的变量别名可按照上述语法规则自定义。原理就是简单的字符串替换。
[email protected]:~/myProject$ cat ~/.gitconfig
[user]
name = moucheng
email = [email protected]
[alias]
br = branch
a = add
ck = checkout
H = HEAD
co = commit
Git refspec与远程标签
refspec:表示本地分支与远程分支对应的关系。
git remote show origin //查看本地与远程的对应关系
git push操作完整命令: git push origin srcBranch : destBranch //如:git push origin master:master
git pull操作完整命令: git pull origin srcBranch : destBranch
远程分支重命名:删除原远程分支(git push origin :develop ),推送新分支到远程(git push –u origin test)。
git checkout –b develop /origin/develop //**** 并与远程分支对应
git push origin v1.0 //将标签v1.0推送到远程
git push origin :refs/tags/v6.0 //删除远程分支
git push –u origin test //新建远程分支
git checkout –b test //新建本地分支并切换到该分支
git checkout --track origin/test //将本地分支与远程分支建立连接
git裸库与submodule
git裸库:它是一个没有工作区的版本库,仅仅用来存放和中转开发者提供代码的一个区域。
git 裸库的初始化:git init –bare
submodule由来:在项目越做越大,一个项目的运行需要依赖其他项目时,引入submodule机制可方便轻松的获取另一个项目的改动信息。
相关步骤:
submodule更新:
在单个的submodule目录下执行:git pull
或者在parent目录下执行: git submodule foreach git pull
clone项目(包含子模块):git clone url pro_name --recursive
submodule删除:1将submodule从缓存区删除,2将submodule实体文件从工作区删除,3将.gitsubmodule目录删除。
subtree
submodule和subtree它们解决的问题是一样的,但是submodule存在一个弊端,比如我们需要在父工程中修改子工程的代码,然后推送到远程仓库中,或者从远程的子工程拉去代码到父工程中,会存在各种问题。
操作:
git subtree //查看subtree操作的相关命令
git remote add subtree-origin child_url //与远程的子项目进行关联
git subtree add –preflix = subtree subtree-origin master //拉取远程子项目
git subtree push –preflix=subtree subtree-origin master //将代码推送到子远程仓库
git subtree pull –preflix=subtree subtree-origin master //更新