所有的控制版本系统,只能跟踪文本文件的改动(TXT文件,网页,程序代码等)
而图片,视频这些二进制文件,虽然可由版本控制系统管理,但没法跟踪文件的变化。
创建版本库
- mkdir learnGit
- cd learGit
- pwd
- git init
通过
- ls -ah
查看隐藏文件,可看到 .git文件
把文件添加到版本库:
先写好一个readme文件放到 learnGit文件夹下
- git add readme.txt
- git commit -m “wrote a readme file”
其中 -m 后面输入的为本次提交说明,可输入任何内容,要有意义
Git支持一次提交多个文件
- git add file2.txt file3.txt
- git commit -m “add 2 files”
时光机穿梭
查看都有说明文件被修改了
- git status
查看目标文件修改的具体内容,wq可直接退出,键盘上下键可翻页
- git diff readme.txt
知道了具体的修改内容后,再将它提交到仓库中
- git add readme.txt
不会有任何回应,再次查看状态,将看到修改后的文件,此文将将被提交
- git status
最后使用commit提交文件
- git commit -m “changed my readme file”
- git status
随时查看状态,告诉自己有什么被修改过
版本回退
head指向那个版本,当前版本就为哪个版本
Head 指向的版本就是当前版本,git log可查看想要回到的版本,git reflog重返未来可查看对版本都做过什么操作,git reset —hard +版本号 可回到未来
- git log 查看历史提交信息
- git log —pretty=oneline 历史提交信息每一条都简化为一条,前面的一连串为版本号
- git reset —hard HEAD ^ 回退到上一个版本(记住后面的那个符号),21世纪去19世纪
- git reset —hard 5397ad2 后面的为版本号,从19世纪回到21世纪
- git reflog 记录你对版本修改的每一次命令
工作区和暂存区
工作区:
电脑里能看到的目录,比如我们的learnGit文件夹就是一个工作区
版本库:
工作区有一个隐藏的目录.git,这个不算工作区,而是git的版本库
.git中存了很多东西,最重要的为stage的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针交HEAD
1.git add 把文件添加到暂存区
2.git commit 把暂存区的所有内容提交到当前分支
由于git为我们创建了分支,因此,之前的git commit都是往master分支提交。
一旦git commit之后,并且没有对工作区做任何修改,那么暂存区就是“干净”的
管理修改
只会提交第一次的内容,因为没有git add (错误)
第一次修改——》git add ——》第二次修改——》git commit
两次内容合并后提交 (正确)
第一次修改——》git add——》第二次修改——》git add——》git commit
撤销修改
(还未add前)将文件内容撤销到本次修改前,git status上会有提示是否可以git checkout
- git checkout — readem.txt
(Add之后)将暂存区退回到工作区
- git reset HEAD readem.txt
删除文件
如果删除了并且已经commit,则恢复到最新版本即可找到之前文件,但最近的修改将找不回,仅可恢复到最新文件
真的想删除
- rm ancg.txt 工作区删除
- git status 将告诉你发生了什么变化
- git rm ancg.txt 在git中也删除
- git commit -m “remove ancg.txt” 最后commit提交
如果是误删文件,想要找回
- git checkout —ancg.txt
添加远程仓库
本地有了一个git仓库,github上也建了一个远程仓库,想要让两个仓库进行远程同步。
- git remote add origin git@github.com:anchaoguang/learnGit.git
上面的anchaoguang为github账户名,添加后远程仓库的名字就是origin(默认,可改)
- git push -u origin master 将当前分支master推送到远程
上面的 master是本地仓库分支,origin为远程仓库名(默认,可改)
由于origin是空的,我们第一次推送master分支时,加上-u参数,git不会把本地master分支推送到远程新的master分支,还会把本地的master分支和远程master分支关联起来,在以后的推送或者拉取时就可以简化命令。
工作中当然还是关联master分支最好
从远程库克隆
将远程仓库的文件克隆到本地库
- git clone git@github.com:anchaoguang/learnGit.git
上面anchaoguang为账户名,learnGit为项目名
创建和合并分支
使用checkout或者swich,除了创建并切换不同,其余可用swich替代checkout
Swich中创建并切换为
- git swich -c dev
Check中创建并切换
- git checkout -b dev 创建并切换到dev分支
上面的 -b 表示切换的意思,相当于以下两条命令
- git banch dev
- git checkout dev
查看当前分支
- git branch
在分支修改工作区文件并add及commit,dev分支的工作完成,接下来合并到master
- git add readem.txt
- git commit -m “branch test”
切回master并merge合并
- git checkout master
- git merge dev
合并完之后,就可以删除分支了
- git branch -d dev
解决冲突
当两个分支修改了同一个内容时,将产生冲突
在最后合并的时候,会报错,产生了冲突
- git status 可以看状态
- Cat readem.txt 查看文件可看到产生冲突的位置
在改完冲突之后再 add commit merge即可
- git log —graph —pretty=oneline —abbrev-commit 看到分支合并情况
分支管理策略
通常合并分支时,git会用到fast forward模式,删除分支后,会丢掉分支的信息
如果要强制禁用fast forward模式,git就会在merge时生成一个新的commit,这样在分支历史上就可以看出分支信息
- git merge —no-ff -m “merge with no-ff” dev
Fast forward 合并就看不出来曾今做个的合并,
禁用之后就可以看了
Bug分支
当接到一个处理bug通知,master有bug急需处理,而现在dev分支的东西写到一半怎么办。
- git stash 先将当前工作现场“储存起来”(dev中)
- git checkout master 先切到master中
- git checkout -b issue-101 创建临时分支用来修复bug
- add commit
- 切回master
- 合并分支,删除临时分支
- 切到工作分支,dev
- Git stash list 查看刚刚保存的工作现场到哪去了
方式1.
- git stash apply 恢复,但恢复后还需git stash drop来删除
方式2.
- git stash pop 恢复,并删除stash内容
早期的bug被发现之后,回直到,dev中也是有bug的,因此可使用以下命令
- git cherry-pick 4c805e2 复制提交所做的修改
4c805e2 为修改后提交号,,,,
Feature分支
每添加一个新功能最好开一个新分支,开发完后切回,合并,删除
当还未合并时,接到命令需要删除featrue分支
- git branch -D featrue-vulcan
上面-D为大写D,强制删除,,,,featrue-vulcan为分支名
多人协作
- Git remote 查看远程库信息
- git remote -v 显示更详细信息
推送分支
- git push origin master 将本地master推送到远程origin
- git push origin dev 将本地dev 推送到远程
在push前一定要先pull,拉取最新代码,
- git branch —set-upstream-to=origin/dev dev
origin/dev 为远程origin下的dev 后面的dev为本地dev,将两个dev绑定
- git pull
- git commit -m”fix”
- Git push origin dev
Rebase
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
标签
用来使用标签替代原有的那一串数字字母(commit id)
切换到打标签的分支上
- Git tag v1.0 当前分支打标签
- Git tag 查看所有标签
- git log --pretty=oneline --abbrev-commit 查看所有提交记录
- git tag v0.9 f52c633 将commit id为f52c633 改为v0.9标签