创建版本库和跟踪操作
在电脑上建一个仓库,通过git init命令将这个仓库变成git可管理的仓库
版本控制系统只能控制文本文件的改动
- git add告诉git,把文件添加到.git版本库中的暂存区(stage)
$ git add readme.txt - git commit告诉git,把文件提交到仓库,git commit就是往master分支上提交更改。
$ git commit -m "wrote a readme file"
-m后面输入的是本次提交的说明,可以输入任何内容 - 总:git add可以多次使用,添加多个文件到暂存区;git commit -m xxx可以一次提交多个文件,是将文件提交到仓库。需要提交的文件修改统统放在stage,然后一次性提交stage的所有文件修改到branch。可以通过git status查看是否有文件未提交
- 修改readme.txt文件,git status查看发现未提交的修改,要想查看到底修改了什么内容用git diff readme.txt
- 再次修改,重新add和commit修改后的文件,用git log由近及远查看提交的情况
- git reset --hard HEAD^回退到上一版本
git reset --hard HEAD^^回退到上上个版本
git reset --hard HEAD~100 回退到前100个版本
git reset --hard 20f2bc 回退到指定的版本号
通过git reflog获取到commit id内容的版本,查看命令历史
通过git log查看提交历史
- 工作区:电脑上的目录;版本库(Repository):比如工作区中的.git隐藏目录,不属于工作区,是版本库。
- 版本库里最重要的是stage暂存区,git add 添加到暂存区,git commit将暂存区的所有更改提交到当前所在的分支上。
- 还有git为我们创建的分支master,指向master的指针head
类似基本代码提交顺序
工作区、暂存区(stage/index)、远程仓库
连接远程仓库
创建SSH Key
ssh-keygen -t rsa –C "youremail@example.com"
先找到本地仓库,cd到本地仓库,再git到远程库,远程库的名字是origin
git@github.com:username/testgit.git 这是使用ssh协议
关联到远程库$ git remote add origin git@github.com:Christina7/testgit.git
下一步,把本地仓库远程分支master的内容推送到远程仓库
先$ git pull --rebase origin master进行代码合并
pull=fetch+merge
在本地仓库里多了README.md文件
再执行$ git push -u origin master
第一次推送-u,关联本地master分支和远程的master分支,以后可以简化推送/拉取
以后只要本地做了修改直接git push origin master,把本地的master分支的最新修改推送到github,真正拥有分布式版本库
idea连接github出现invalid authentication data connection reset
新建http proxy
然后再登录github不会再报错
分支管理
创建与合并分支
每次提交的时间线就是一个分支,HEAD指向的是当前分支
git checkout -b dev创建并切换到dev分支
相当于git branch dev创建dev分支和git checkout dev切换到dev分支
可以用git branch查看所有分支,当前所在分支上有*
在dev分支上对文件做的修改和提交,在master分支上查看不到,需要先将dev分支上的内容合并到master上。先用git checkout master切换到master分支,再git merge dev,合并指定分支到当前分支上
git branch -d dev 删除dev分支
git branch 查看所有分支
git branch dev 创建dev分支
git checkout dev 切换到dev分支
git checkout -b dev 创建并切换到dev分支
git merge dev 合并dev分支到当前分支
解决冲突
在fenzhi上的readme.txt添加了888,在master上的readme.txt添加了999,版本产生了冲突,无法在master上自动合并fenzhi
修改readme.txt成跟主干一致的,再用git log 查看分支合并情况
分支管理策略
- 一般主分支非常稳定,用来发布新版本,不允许在上面干活,干活一般在新建的dev分支上,干完后/dev分支代码稳定后,合并到master上
- 一般在fast forward模式下,删除分支后,该分支上的之前处理过的信息都会丢失,可以使用参数--no-ff来禁用fast forward,这样合并后删除分支,但分支之前的处理信息仍然保留
- 普通模式git merge --no-ff -m "xxx" dev合并dev到master的效果:
报错处理:nothing added to commit but untracked files present
上图表明:1. add的文件并没有修改过,无法提交变更 2. geektime-spring-family/没有add,commit时无法识别,git没有把提交的文件加载进来,报红色的是需要提交的文件。
解决方案:可以直接移除该文件,或者按如下步骤解决:
(1)用git add XXX(文件名) 把提示报红色的文件加上
(2)git commit -m "xxx"
(3)git push -u origin master重新提交
一定是修改后再add,commit变更
删除分支dev后查看到,之前的处理信息仍然保留
团队合作分支的效果
每个人在自己的分支上干活,先合并大家的结果到dev分支,最后的稳定版提交到master,合并时用--no-ff 分支名,普通模式合并,保留分支更改历史
bug分支
修复bug时,会创建新的bug分支进行修复,然后合并,最后删除
主要命令
- 当手头工作尚未完成,先把工作现场git stash,然后去修复bug,修复后再git stash pop,回到工作现场,恢复的同时也把stash的内容删除了
- git stash list 查看工作现场
- git stash apply stash@{0} 恢复
- git stash drop
feature分支
每添加一个新功能,最好新建一个feature分支,在上面开发,完成后切换到dev,在dev上合并feature分支,最后删除该分支,注意
- dev上删除已合并的分支 git branch -d feature-volcan
- dev上强制删除还没有合并的,另一个分支 git branch -D feature-wolcan
多人协作
查看远程库信息,fetch抓取,push推送
推送分支
把该分支上的所有本地提交推送到远程库
- git push origin dev 推送dev分支,开发分支,开发成员都要在上面工作,需要同步
- master主分支,最终同步
- bug分支可以不同步,就在本地修复bug
删除文件
文件管理器中删了 rm vulcan.txt,工作区和版本库不一致
git status告知哪些文件被删除了
再确实从版本库中删除 git rm vulcan.txt
一定要记得提交 git commit -m "delete vulcan"
这样文件也从版本库中删除了
最后和远程仓库的分支同步 git push origin dev另一种情况是误删了,可以从版本库中恢复git checkout -- vulcan.txt
抓取分支
- 另外一台电脑,需要把这台电脑的SSHkey添加到github上,一般小伙伴从远程库clone时,默认只能看到本地的master分支
- 但他也要在dev分支上开发,必须创建远程origin的dev到本地
$ git checkout -b dev origin/dev,然后看到的就是远程库dev上的内容,就可以在dev上修改
- 修改后,add/commit,最后将dev分支push到远程$ git push origin dev
这样小伙伴就在origin/dev分支上推送完成了提交,而我在另一个目录,也对同一个文件同一处做修改,试图推送时会出现冲突。即不同的人推同样的文件到dev,修改同一个文件的同一个地方出错,有冲突
解决办法:
- 先$ git branch --set-upstream-to=origin/dev dev绑定本地的dev分支和远程origin/dev的链接
- 再用git pull把最新的提交从origin/dev抓取下来,本地合并,手动解决冲突
- 最后推送到远程的dev
小结:
- 可以先试图用git push origin dev推送自己的修改
- 如果推送失败,先用git pull合并,若合并有冲突,则解决冲突,本地提交
- 没有冲突后,再git push origin dev推送就能成功
- 若git pull提示no tracking information,则应首先创建本地分支和远程分支的链接
- 建立关联用$ git branch --set-upstream-to=origin/dev dev
- 在本地创建和远程分支一样的分支,最好名称一致,用
$ git checkout -b dev origin/dev
标签管理
- 发布一个版本时,通常在版本库中先打一个标签,唯一确定一个版本,标签是版本库的一个快照。
- 本质就是指向某个commit的指针,commit号太长,引入tag绑定某个commit。
- 类似分支,但分支可以移动,标签不可移动,创建和删除标签都是瞬间完成的。
创建标签
默认tag是打在最新提交的commit上的,若想对历史commit打上标签,需要先查找历史提交的版本号,再打上标签。
注意:标签是按字母顺序排的,不是按时间列出
相关命令
- git log --pretty=oneline --abbrev-commit 历史commit提交
- git tag vxx 默认给最新的commit打tag
- git tag vxx 版本号 给某个版本的commit打tag
- git tag -a vxx 版本号 -m "说明文字"
- git tag 显示所有tag
- git show 某个tag的详细信息
操作标签
- 本地删除标签 git tag -d v0.1
- 推送某个tag到远程 git push origin v1.0
- 一次性推送全部标签 git push origin --tags
- 删除远程标签,先从本地删除,再从远程删除 git push origin:refs/tags/v0.9
git的常见使用
- 假设在自己的分支chris上完成了开发 git add xxxfile
git commit -m "chris complete"
推送到远程git push -u origin chris - 把chris分支上的代码合并到dev上,
- 首先要切换到dev分支,git checkout dev,
- 再把远程dev上的代码pull下来,git pull origin dev,
- 然后把chris分支代码合并到dev,git merge chris,
- 查看状态git status,
- 最后push到远程的dev上,git push origin dev
- 不推荐用git add . 它会将所有untracked file和changed file添加到暂存区
- 提交时过一遍进行过的修改,针对性地添加文件,提交
- 若想保证一个干净的工程,即没有编译过的文件,大部分都是untracked file
- 可以用git clean -f清除untracked文件
- git clean -df清除untracked目录和文件
- 这样未add的文件就不会被意外操作添加进来了
- git reflog查看命令历史,里面有版本号
- git checkout HEAD@{90} 会使用指定commit提交的内容覆盖工作区
idea同步代码到github
- vcs,import into version control——>creat repository创建了本地仓库,有了暂存区.git隐藏文件夹
- 初始化,选中项目add,加到本地仓库。
- vcs,git,commit,提交java,resource,test,pom文件,其他的maven的文件不需要提交,在Commit message上写好注释。
- 在远程仓库上新建git项目。拷贝路径,vcs-git-push,定义路径。
- 注意一定是新建的repository,里面原来没有文件,才能push成功
- 修改的代码,文件名变成蓝色,commit选中该修改后的代码,然后push