使用流程图
0,名词解释
版本控制
版本控制就是允许你的项目存在多种形态,你可以根据自己的需要随心所欲的对项目存档,取档,分支,合并,删除。
早在远古时期,程序猿在开发软件的过程中如果遇到重大修改,为了防止修改过程中产生更严重的问题,通常会采用复制文件乃至整个文件夹的方法为文件存档。就如同上面这张荒唐的图,我就曾干过一个php的项目存档10几个G的蠢事,哈哈哈。后来知道了诸如svn这样的版本控制系统,仅通过简单的命令即可达到存档的效果,还拥有diff、还原、协作等许许多多的功能,真是让人眼前一亮。再后来linus大神用一星期搞出了git。。。真是感觉世界都清爽了。。值得一提的是git与其他版本控制软件的不同之处在于它只保存修改,因此他的效率与资源占用都是比较优秀的。
branch分支
分支就相当于不同的版本,比如软件有预览版,正式版,共享版,测试版。主要部分都一样,个别功能有区别。当然你也可以分支出一个相同的版本,然后在这个新分支里做修改,做实验。完成后再与主分支合并。分支就是项目的另一个版本,在git中你可以随意的创建、合并或删除。
Index(索引、缓存)
当你在本地做了某些修改需要提交的时候,必须先使用add git fileName 将修改加入缓存。他相当于一个愿望列表,是你希望修改的文件的列表,如果你不将修改后的文件加入这个列表,那么当入库时将无法记录这个文件。可以把它理解为一个清单。
HEAD
HEAD其实就是指针,指向你当前的分支。
仓库
仓库是你真正要保存代码的地方。你在缓存里留下的保存清单,通过commit命令,会直接保存在仓库里。你还可以直接增删改查仓库里的代码版本。
远程仓库
远程仓库指的如github或gitlib代码服务器上的非本地仓库。git允许你离线在本地使用,也允许你将本地代码上传到远程服务器或将远程服务器的代码部署到本地。
1,安装配置git
0,安装git
windows上安装git
http://msysgit.github.io/
1,设置git的账户信息
git config --global user.name "git上注册的用户名" git config --global user.email "git上注册的邮箱名"
2,设置下载缓存
git config --global http.postBuffer 容量
容量部分可以大点:5242880000,可以用来解决git pull的故障。
3,代理
git config --global http.proxy 127.0.0.1:8087 git config --global http.sslVerify false
##2,流程解读
####一个版本控制的使用流程
1,安装好git后进入项目目录
mkdir myobj
//建立文件夹
cd myobj
//进入文件夹
2,初始化git
git init
在项目目录下运行使git接管项目文件
此时如果你对项目文件进行了修改,运行git status
或git checkout
就会看到。
3,将希望保存的文件加入索引(index)。
echo "# 一个样本" >> test.txt
//新建一个文件
git add 已修改并想要提交入库的文件名
将文件加入缓存。这是很重要的一步,这个缓存中的内容就是即将保存到代码仓库的文件。如果你想撤销某个文件的加入,可以使用git checkout -- filename
或是git reset head -- fileName
来取消。
4,将索引中的文件提交到仓库中
使用
git commit -m 版本说明
命令提交入库。
也可以使用git commit -am 版本说明
来跳过加入缓存的步骤直接入库。
提交后,git会在你的仓库生成一份存档。他带有身份码,方便你随时还原版本。如果想撤销某个入库的提交,可以使用git reset
来实现。通过git log
命令可以看到这些操作记录。
这就是一个简单的使用流程。当然我说的很罗嗦,因为当时我不了解这些概念所以自己困扰了很久。希望可以以我的方式让你明白git的概念和用法。
实现一个分支(branch)
举个栗子来说明这个我认为git最重要的功能。那么现在我有这么一个需求,我想给当前的项目增加一些功能,但是我又没有充分的测试他的稳定性。我需要做一个测试版,当测试都没问题后,再把它变为主版本。这时我们就需要git的branch,也就是分支功能了。
流程如下
1,为当前项目创建一个分支
git branch 分支名
2,显示所有分支
git branch
master是git项目创建时的默认分支。
3,切换分支
git checkout 分支名
git checkout -b 分支名
可以取代1-3步的过程,直接新建并切换分支。切换分支后,你的工作区代码也会变成当前分支最后一次提交的状态。
4,合并分支
git merge
自动合并分支
git merge 分支名
将指定分支与当前分支合并。(用指定的分支来更新master的分支。)
如果发生文件冲突,就是你的分支还没与master合并,master的文件又发生了改变,有冲突的地方就会在文件中被标示出来。如果你使用的编辑器是atom就会直接弹出选择按钮,配合git diff等方法解决十分方便,然后再通过git add和git commit来重新提交冲突文件。
5,删除分支
git branch -d 分支名
带有谨慎态度的删除
git branch -D 分支名'
强制删除
6,查看远程分支
git branch -r
远程库操作流程(remote)
1,在gitbub上新建一个库
在github->new repository 中新建一个库。repository name 就是新库名。点create repository就完成了新建。
2,添加一个ssh key
ssh-keygen -t sra -C "注册的邮箱账号@qq.com"
your@email.com是你在git上注册的邮箱名。一路回车后 在/文件夹下找到 .ssh文件夹。然后里面有个id_rsa.pub内容就是ssh key,将ssh key 复制到 gitbub网站的account->settings->new ssh kye - >key中,然后点add ssh key的按钮。成功后可验证一下ssh -T git@gitbub.com
3,新本地项目
mkdir myobj
//建立文件夹
cd myobj
//进入文件夹
git init
//初始化git
echo "# 一个样本" >> test.txt
//新建一个文件
git commit -am test.txt "new one"
//将文件修改入库
如果要求你输入密码就输入在github上注册的用户名密码
4,添加一个远程库
git remote add 自定义远程库名 远程库url地址
自定义远程库名就是调用名,一般默认用origin。远程库url地址就是github项目的地址。
例:git remote add origin1 https://github.com/155366311/AUGJS
git remote
// 查看当前所有远程库
5,上传代码到远程库
git push -u origin master
origin是远程库名,master是分支名 第一次连接需要用-u 参数,以后就不用了
6,提取远程库
git fetch origin
运行该命令后远程库origin会下载到本地master分支中,
git fetch origin originBranchName:localBranchName
将远程到分支下载到指定的分支。
7,同步到本地工作区
git merge origin/master
6和7是组合使用的,先用fetch命令下载远程库,再用merge命令将再在的远程库origin合并到master分支
git checkout localBranchName
git merge targetBranchName
//切换到要合并的分支,然后使用merge与目标分支合并。
** 78 拉取并与本地合并
pull命令就是fetch与merge的集合。
使用fetch拉去后你需要通过merge来与本地文件合并。使用pull会直接自动合并。一般的套路是先从远程库pull最新的代码 到 一个新的分支,再用本地的开发分支与新分支合并。不要直接与本地开发分支合并。
git pull origin originBranchName:localBranchName
//将远程库的制定分支来到本地指定分支
8,将本地更新推送到远程库
git push origin branch
将master分支推送到origin远程库
git push origin localBranchName:originBranchName
将本地指定分支推送到远程origin远程库指定分支
9,删除远程库
git remote rm origin
从远程库下载一个项目
git clone 远程库地址
//把远端库中的内容拷贝到本地,不会建立分支,没有加入tracking,也没有log信息。如果要进行库操作必须先git init初始化。
git pull 远程库地址
//不仅下载到本地还自动建立master分支等信息,与远端库一致。如果项目是本地新建的,必须先inti初始化。
git pull origin master
把本地的master分支更新成远程库的状态。就是获取远程库origin,并与master分支merge合并
从远程库下载指定分支
使用Git下载指定分支命令为:git clone -b 分支名仓库地址
使用Git下载v.2.8.1分支代码,使用命令:git clone -b branchname https://git.projectionname.git
clone,fetch,pull的区别
clone 是单纯的把远程代码下载到本地,不建立联系。
fetch 是下载到本地后,不与当前工作目录合并,如果合并需要再使用merge命令合并。
pull 是fetch与merge的联合命令,下载远程库并建立,还会自动与本地工作目录合并代码。
回退提交
git reset 版本号
:回退到指定的commit版本。慎用。
git reset --soft 版本号
:回退当前commit到某个版本,只回退了commit,不会影响当前的index索引。如果还要提交可以继续commit。
git reset --hard 版本号
:彻底回退到某个版本,本地工作区也会变为那个版本的内容,缓存、commit都会被回退
版本号 可以是commit记录的前7位 粒:a8732c1
查看操作
查看文件状态
git status
git status -s
//简短形式
查看操作日志
git log
git log --oneline
//简洁查看
git log -1
//只查看1条
git log --graph
//只查看分支记录
git log --reverse --oneline
逆向查看记录
``git log origin/branchName -n 3//查看3条远程日志
查看文件修改情况
git diff
查看还没有加入索引的改动
git diff --cached
查看已经加入索引但还没提交到库改动
git diff head
查看加入索引和未加入索引的所有改动
git diff --stat
查看改动摘要
查看当前的远程库
git remote
git remote -v
查看远程库对应地址
###移动、删除文件
只是手动在目录中删除文件会导致git无法跟踪。所以必须使用git的删除命令
git rm ileName
如果文件已经修改在缓存区,就需要强制删除:git rm -f 文件名
只从索引中删除,但希望保留在工作目录:git rm --cached 文件名
进入目录,删除该目录和所有子文件,递归删除:git rm -r *
移动或重命名文件
git mv 文件名 新文件名
放弃合并merge
git merge abort
合并commite
1,git log 查看日志
2,git rebase -i HEAD~4 合并最后4次提交
就会进入文本编辑:
pick 5e187c7dbe8 add center style indent
pick 6d577eb3440 add center style
pick f9b9508a3ab add center style
将需要被合并的id前面 的pick 改为 s
pick 5e187c7dbe8 add center style indent
s 6d577eb3440 add center style
s f9b9508a3ab add center style
然后 :wq保存
即可成功提交
3,如果有冲突,需要修改后, git add .
然后 git rebase --continue。
如果不想合并了,git rebase --abort
4,提交到远程仓库 git push -f (强制提交)
注意,也许会因为你的git角色不是master 而不能提交到master。这时需要到gitlab上修改project setting 的 protected 中设置角色权限。
大概率出现,你是master也无法提交。这时候,可以通过在本地新建一个分支,然后将分支提交到远程仓库,再合并分支的方法解决问题。
参考:
https://blog.youkuaiyun.com/baidu_33387365/article/details/82498264
https://blog.youkuaiyun.com/yuanfang_way/article/details/78970709
用户相关
查看用户名:
git config user.name
查看邮箱:
git config user.email
修改用户名:
git config --global user.name "username"
修改邮箱:
git config --global user.email "email"
user.name或者user.email需有空格
合并代码
1 创建dev分支
git branch dev
git checkout dev
2 在dev中开发并保存
git add.
git commit -am""
3 切换到目标分支
git checkout master
5 将目标分支合并过来
git cherry-pick commit-id
例:git cherry-pick 5451fgv1
6 解决冲突
如果显示错误:error: could not apply 064d1251… comit test
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add ’ or 'git rm ’
hint: and commit the result with ‘git commit’
说明需要解决冲突。在代码中会发现HEAD 和 COMMit标记,手动解决取舍后
先使用
git add .
然后直接调用 continue 等于再次commit
也可以像普通提交那样使用流程
技巧
在提交代码前,不想提交你现有的工作,可以先存起来,然后pull,然后再返回来。
git stash。//将当前工作暂存在栈里
git pull newcode //做了一些修改,或者是pull了新代码
git stash pop //还原工作区
进阶:
git stash save “work in progress for foo feature”
多次使用’git stash’命令后栈里将充满了未提交的代码。使用git stash list’ 命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,例如使用’git stash apply stash@{1}’就可以将你指定版本号为stash@{1}的工作取出来,当你将所有的栈都应用回来的时候,可以使用’git stash clear’来将栈清空。
查看本地和远程分支的差异
git diff master origin/master
避免 fast forword 和 merge 或多余的commit的push方法
`
git stash。//将当前工作暂存在栈里
git pull branchName -r //做了一些修改,或者是pull了新代码
git stash pop //还原工作
`