Git 版本控制管理 总结
博客专区 > asjoker 的博客 > 博客详情
Git 版本控制管理 总结
asjoker 发表于1年前
Git 版本控制管理 总结
  • 发表于 1年前
  • 阅读 24
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: Git

Git

CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统

先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。

CVS作为最早的开源而且免费的集中式版本控制系统,直到现在还有不少人在用。由于CVS自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。同样是开源而且免费的SVN修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制系统。

Git是一款免费、开源的分布式版本控制系统,

命令

  • pwd 命令用于显示当前目录

  • git init 命令把这个目录变成Git可以管理的仓库

  • git reflog 用来记录你的每一次命令

  • git log 命令显示从最近到最远的提交日志 git log --pretty=oneline 简化日志信息 git log --graph 命令可以看到分支合并图 一大串类似 3628164...882e1e0 的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示

回退指定版本

  • git reset --hard HEAD^ 回退到上一个版本,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
  • git reset --hard 3628164 回退到指定版本,版本号没必要写全,前几位就可以了,Git会自动去找

文件

  • git status 命令可以让我们时刻掌握仓库当前的状态,告诉你有文件被修改过
  • git diff 可以查看修改内容
  • git add 文件名.扩展名 把文件修改添加到暂存区
  • git commit -m '本次提交的说明' 把暂存区的所有内容提交到当前分支
  • git checkout -- readme.txt 把readme.txt文件在工作区的修改全部撤销 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

远程仓库

  • git push -u origin master 由于远程库是空的,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
  • git push origin master 把本地分支的最新修改推送远程
  • git remote add origin git@server-name:path/repo-name.git 关联一个远程库
  • git clone git@github.com:michaelliao/gitskills.git 克隆仓库到本地

分支

Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

  • git branch dev 在当前分支基础上创建 dev 分支

  • git checkout dev 切换到 dev 分支

  • git checkout -b dev 在当前分支基础上创建并切换到dev分支 相当于 git branch devgit checkout dev 2个命令

  • git branch 会列出所有分支,当前分支前面会标一个*号。

  • git merge dev 用于合并 指定分支dev 到当前分支

  • git merge --no-ff -m "merge with no-ff" dev 注意--no-ff参数,表示禁用Fast forward 合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

  • git branch -d dev 删除dev分支

  • git branch -D dev

  • git stash 可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作

  • git stash list 查看工作现场

    Git把stash内容存在某个地方了,但是需要恢复一下

    • 一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
    • 另一种方式是用git stash pop,恢复的同时把stash内容也删了
  • git push origin branch-name 从本地推送到远程分支,如果推送失败,先用 git pull 抓取远程的新提交

  • git remote -v 查看远程库信息,显示了可以抓取和推送的origin的地址

  • git checkout -b branch-name origin/branch-name 在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致

  • git branch --set-upstream branch-name origin/branch-name 建立本地分支和远程分支的关联

  • git fetch [branch-name] 取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名,将某个远程主机的更新,全部取回本地

标签管理

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

  • git tag <name> 就可以打一个新标签,默认标签是打在最新提交的commit上的
  • git tag v0.9 6224937 给 历史提交的commit id 打标签
  • git tag -a v0.1 -m "version 0.1 released" 3628164 给 历史提交的commit id 创建带有说明的标签,用-a指定标签名,-m指定说明文字
  • git tag 查看所有标签,标签不是按时间顺序列出,而是按字母排序的
  • git show <tagname> 查看标签信息
  • git push origin <tagname> 推送某个标签到远程
  • git push origin --tags 一次性推送全部尚未推送到远程的本地标签
  • git tag -d <tagname> 可以删除一个本地标签
  • git push origin :refs/tags/<tagname> 可以删除一个远程标签。 如果标签已经推送到远程,要删除远程标签,先从本地删除: git tag -d v0.9 然后,从远程删除: git push origin :refs/tags/v0.9

常用问题总结

让Git显示颜色,会让命令输出看起来更醒目

git config --global color.ui true

合并分支文件冲突

git merge dev 用于合并 指定分支dev 到当前分支 文件冲突,必须手动解决冲突后再提交。 git status 也可以告诉我们冲突的文件 Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容

BUG分支

每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

  1. 可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
  2. 在master分支上修复,就从master创建临时分支 git checkout master git checkout -b bug002
  3. 修复bug并提交到 bug002
  4. 切换到master分支,完成合并,删除 bug002 分支 git checkout master git merge --no-ff -m "merged bug " bug002 git branch -d bug002
  5. 回到dev分支 恢复 stash

git reset

reset命令有3种方式: 1:git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息 2:git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可 3:git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容

# 回退所有内容到上一个版本 
git reset HEAD^ 
# 回退a.py这个文件的版本到上一个版本 
git reset HEAD^ a.py 
# 向前回退到第3个版本 
git reset –soft HEAD~3 
# 将本地的状态回退到和远程的一样 
git reset –hard origin/master 
# 回退到某个版本 
git reset 057d 
# 回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit 
git revert HEAD 

git checkout -- file 与 git reset

  • git checkout主要有三个作用:

    • 切换分支。例如你从远程仓库clone下来所有的源代码,你git branch一下会看到你通常是在master,如果你想切换到某一个分支上呢?git checkout <branchname>
    • 放弃对某个文件的修改。例如你想放弃对某个文件Hello.cpp的修改,git checkout -- <Hello.cpp>
    • 新建一个分支,git checkout <-b> <branchname>,不加-b的话只新建不切换到新的分支上,加-b新建并切换到该分支上
  • git reset主要是取消上一次的操作,具体用法有很多,说两个:

    • git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
    • git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
    • git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
  • git checkout -- file;

    撤销对工作区修改;这个命令是以最新的存储时间节点(add和commit)为参照,覆盖工作区对应文件file;这个命令改变的是工作区

  • git reset HEAD -- file

    清空add命令向暂存区提交的关于file文件的修改(Ustage);这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化

gitignore 忽略特殊文件

github/gitignore

  1. cd 项目根目录
  2. touch .gitignore 在文件夹就生成了一个.gitignore文件
  3. 编辑
  4. 提交到Git

git rm --cached XXX.xcodeproj/project.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate

标签: Git
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 10
博文 108
码字总数 79411
×
asjoker
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: