Git
Git是目前世界上最先进的分布式版本控制系统,版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统
创建一个版本库并进行初始化,Git自动为我们创建了唯一一个master
分支
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
工作区与版本库
工作区
就是你在电脑里能看到的目录
版本库
工作区有一个隐藏目录.git,就是Git的版本库
创建版本库
切换目录位置 cd F:/task
显示当前目录位置 pwd
创建repository mkdir <file>
(在工作区生成文件夹)
初始化repository git init
//把这个目录变成Git可以管理的仓库
(初始化后,在当前目录下会出现一个名为.git的目录,所有git需要的数据和资源都存放在这个目录中,.git目录,这个目录默认是隐藏的,用ls -ah
命令就可以看见。
工作区文件操作
cat <file> //查看当前工作区文件具体内容
git checkout -- <file>//其实是用版本库里的最新版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
rm <file> //从工作区删除文件
git版本库暂存区操作
git add <file> //添加文件到暂存区
git add -u//只会处理已修改或者已删除的文件,但是不会处理新建的文件
git reset HEAD file //将文件的版本库的最新版本重新放回工作区(已add)
git版本库操作
保存快照到分支:git commit -m '说明'
//提交更改,实际上就是把暂存区的所有内容提交到当前分支。
查看快照记录:git log
git log --pretty=oneline //简化信息,方便查看
git log --pretty=oneline --abbrev-commit
git reflog //查看每一次commit以及reset,以便查看commit-id
版本回退:git reset --hard HEAD^
//回退到当前工作区版本的上一个版本
HEAD^:上一个版本
HEAD^^:上上一个版本
HEAD~100:上100个版本
commit-id(对应版本id)
从版本库删除文件:git rm <file>
从远程仓库删除文件:先在工作区删掉,然后git commit -a -m "A file was deleted"
,最后git push
文件状态跟踪记录
状态查看:git status
三种状态
1.untraked file(工作区的文件未被跟踪的文件)
2.changes to be commited(暂存区的文件,将要被提交的修改)
3.changes not staged for commit(没有准备提交的修改或文件之前提交过,然后进行了修改但还未add)
文件修改查看
git diff <file>//(add提交前)
//查看具体修改内容git diff HEAD -- readme.txt
//查看版本库最新版本与工作区最新版本的区别
Git分支
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支,所以分支就是一条commi时间线
。
一个项目可以对应多条分支,也可以对应一条分支
HEAD
严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
创建分支并切换
一步完成:git checkout -b <name>
(-b参数表示创建并切换,)
两步完成:
git branch <name>//创建分支
git checkout <name>//切换分支到当前分支
查看分支:git branch
合并分支:
git merge <name>//合并指定分支到当前分支,fast forward模式
git merge --no-ff <name>//可以看出曾经合并过
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。--no-ff参数,表示禁用Fast forward
删除分支:
git branch -d <name>
git branch -D <name>//强行删除
查看分支合并图
git log --graph
git log --graph --pretty=oneline --abbrev-commit//简化信息
本地分支与远程分支同步
git checkout -b branch-name origin/branch-name//在本地创建和远程分支对应的分支
git branch --set-upstream branch-name origin/branch-name//建立本地分支和远程分支的关联
标签管理
一个版本库保存一个分支master,各自的版本库保存着各自的分支,各自的主分支名称都为master。
发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照
。
标签是指向某个commit的指针
打标签:git tag <name>
//默认标签是打在最新提交的commit上
git tag <name> commit-id(可选)
git tag -a <name> -m '说明' commit-id(可选)
查看标签:git tag
查看标签信息:git show <tagname>
删除标签:git tag -d <tagname>//(本地)
推送标签到远程:
git push origin <tagname>//推送单个
git push origin --tags//推送多个
远程仓库
远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写
查看当前远程库列表:git remote
//它会列出每个远程库的简短名字git remote -v
//-v 选项,显示对应的克隆地址
查看远程仓库信息git remote show [remote-name]
//查看某个远程仓库的详细信息
添加远程仓库git remote add [shortname] [url]
删除远程仓库git remote rm [remote-name]
远程仓库重命名git remote rename [old] [new]
远程操作
远程引用是对远程仓库的引用(指针),包括分支、标签
等等。
远程分支
git ls-remote//显示获得远程引用的完整列表
本地仓库推送至远程库(推送分支) git push [remote-name] [branch-name]
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上
1.git remote add origin git@github.com:murphyuwu/task0001.git
//添加远程仓库origin
git push origin master//实际上是把当前分支master推送到远程库origin。
2.git push -u origin master
//推送当前分支master
(加上了-u参数,Git不但会把`本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令)
从远程库克隆仓库到本地
从远程仓库克隆时,实际上Git自动把本地的master
分支和远程的master
分支对应起来了,如图
git clone git@github.com:murphyuwu/task0001.git
分支的创建与合并
分支创建发生的几件事
1.创建新分支时,新分支会指向现有分支最新的commit对象,如下图。
2.现有分支在工作区以及暂存区的状态,新分支也拥有同样的状态。
3.切换到新分支工作时,会改变之前的状态,并与新分支同步。
正因为切换到新分支工作时,现有分支的状态会与新分支的状态保持同步,因此为了避免这一状况,可以保住现有工作区的状态,再切换到新分支工作,此时新分支的状态就是干净的
git stash //保存当前工作现场
git stash drop //删除保存
git stash apply //恢复现场,但并不删除保存
git stash pop //恢复现场,并删除保存
git stash list //查看保存工作情况
Fast Forward
$ git checkout -b dev//创建并切换分支到dev分支
$ git add readme.txt
$ git commit -m "branch test"//dev分支向前移一步
$ git checkout maste//切换到master分支
$ git merge dev//master向前一步与dev分支合并
$ git branch -d dev//删除dev分支
冲突修改合并
git checkout -b feature1
$ git add readme.txt
$ git commit -m "AND simple"
$ git checkout master
$ git add readme.txt
$ git commit -m "& simple"
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,收到修改冲突后提交
$ git add readme.txt
$ git commit -m "conflict fixed"
分支管理策略
1.master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
Force “git push” to overwrite remote files
gitlab和github下fork后如何同步源的新更新
git pull——git库版本与本地库版本冲突总结
git push用法和常见问题分析