Git
基本概念
--git是一款免费、开源的分布式版本控制系统,管理软件的版本,版本库中的版本是以提交的形式保存,一次提交的覆盖范围是整个项目
--优点
工作流上的灵活性-->主要是单一开发可使用,敏捷团队也可使用
高性能-->处理项目速度快
强大的抗故障和抗攻击能力
离线开发和多点开发
强大的开源社区
可扩展性-->主要提供很多实用命令
--工作流是相关项目的日常操作规程
--git命令行适用于所有的平台
--Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件
版本库
--版本库本质是一个高效的数据存储结构而已,由文件、目录和版本组成
--所有的数据,根据文件、作者和日期会被计算为一个16进制的散列值(40个字符),一个提交对象的散列值实际上就是"版本号";若该版本号存在于版本库中,则可将其恢复到当前工作区相应目录中,若不存在,也可从其他版本库中导入
--高性能;通过散列值来访问数据是非常快的
--冗余度-释放存储空间:相同文件的内容只需存储一次
--分布式版本号:可离线产生版本号
--版本库中间高效同步/数据完整性/自动重命名检测
--git 中只能对整个项目进行版本化
--创建版本库,存储该项目本身及历史
cd /projection git init -->创建.git目录,在其中创建一个版本库,历史存储在这里
git clone /projection /projection-clone 本地到本地
git clone https://github.systems.com/mobile/mobile-ios.git ~/IdeaProjects/mobile-ios 远程到本地
-->把已存在的版本库克隆过来
--首次提交, 项目的一个版本称为一次提交
git add foo.txt bar.txt 添加到暂存区 git commit --message "Sample project imported" 提交到本地版本库,并赋予该提交一个散列值标识这次提交
git status 检查状态,显示该项目自上次提交以来所发生的所有修改
(1)changes to be comitted 已修改且注册到暂存区,待commit
(2)changed but not updated 已修改但未被注册到暂存区,待add
(3)untracked files 新增的文件
git diff foo.txt 显示每个被修改的行
(1)git diff 暂存区和工作区的不同之处
(2)git diff --staged 当前版本库中head提交与暂存区的不同之处
git log 显示项目提交的历史,按时间降序排列
--提交修改 也是先add 再commit
git add --all 所有的修改存储到暂存区 git commit 提交到本地版本库
--从任意版本库中取回修改pull
pull命令:取回修改 cd /projections/first-steps-clone git pull /projections/first-steps-bare.git master
--push将提交传送给其他版本库
cd /projection git push /projections/first-steps-bare.git master
“git push -f”强制推上去
--注意:当版本库有更新时,先pull取回其他人的更新,在本地合并提交后再push
--git中,恢复到某一版本通常称之为检出checkout
git checkout release1.1
git checkout 657a9300ed375a7e6bbb8643fa4ea08de96cf8a9(提交散列值)
--比较两次提交之间的差异
git diff 77d231f HEAD git diff 77d231f 05bcfd1 - book/biisection
--从暂存区中撤回修改,reset命令可用来重置暂存区
git reset HEAD blan.txt 将blan.txt移出暂存区
git reset --hard 39ea21a 重置分支指针(分支指针主要用于指向当前活动分支,每次提交时移动到最新提交上),重置工作区和暂存区到提交39ea21a的状态
HEAD 是当前分支引用的指针,它总是指向某次commit,默认是上一次的commit,这表示 HEAD 将是下一次提交的父结点
git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针,HEAD 特别指针是一个指向你正在工作中的本地分支的指针,可以将 HEAD 想象为当前分支的别名
--用.gitignore忽略非版本控制文件
--分支
为当前提交创建分支 git branch a-branch
切换分支 git checkout a-branch 强制切换 git checkout --force a-branch
创建并切换到新分支 git branch -b a-branch
删除本地分支 git branch -d feature-a
删除远程版本库分支 git push /mobile-ios : feature-a
merge命令进行分支合并,然后git会基于合并的内容来自动创建一次新的提交
> # on the branch "master" > git merge feature
merge命令能自动对分支进行合并,在合并过程中,若发生冲突,先解决冲突再手动创建提交
pull=fetch + merge 从远程版本库中导入新的提交,然后在必要情况下将他们合并到当前分支上
gc(垃圾回收)命令用于清理版本库,移除所有不属于当前分支的提交对象
--提交自己项目前必须进行更新(特别重要),pull进行更新代码
--红色--表示新创建,未add (add-->commit file) 绿色--表示新创建后add (commit file) 蓝色--表示原已提交过但后来已修改,未提交 (commit file) 白色--表示已提交
若项目中存在待提交的文件(绿色/蓝色),可进行相应勾选,填写commit message,下拉菜单中选择commit and push
若项目中不存在待提交的文件,直接push
reset(回退)
如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法; reset后,head指向该恢复的版本
“git reset --hard 目标版本号”命令将版本回退,再用“git log”查看版本信息,此时本地的HEAD已经指向之前的版本
revert(反做)
如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法,revert之后,生成了一个新版本; Head指向该新版本
使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交
Addition:
1.远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时“master”是当你运行git init时默认的起始分支名字,原因仅仅是它的广泛使用,“origin” 是当你运行 git clone 时默认的远程仓库名字。 如果你运行 git clone -o booyah,那么你默认的远程分支名字将会是 booyah/master
本地分支提交到远程
—git push origin AMH_Panda_mAuth_RecoverProfile_common
2.查看远程仓库
git remote -v
从远程的origin仓库的master分支下载到本地,并新建一个yanzi分支
git fetch origin master:yanzi
查看yanzi分支与本地原有分支的不同
git diff hanzi
将yanzi分支和本地当前分支合并
git merge yanzi
3.删除
删除本地分支 git branch -d feature-a
删除远程版本库分支 git push origin : feature-a
仅删除远程分支文件,不删除本地文件
git rm —cached filename / git rm -r —cached directoryname
git commit -m “delete remote file or directory”
git push -u origin master(此处是当前分支的名字)
同时删除本地文件和远程分支文件
git rm filename / git rm -r directoryname
git commit -m “delete remote file or directory”
git push -u origin master(此处是当前分支的名字)
4.标签tag标识软件版本,给某次提交打上tag,用于识别提交散列值
创建一个tag
为master分支当前版本创建一个1.2.3.4标签,并将其注释为“first tag” git tag 1.2.3.4 master -m “first tag”
推送标签 git push origin 1.2.3.4 / git push --tags
显示标签 git tag / git tag -l 1.2.*
同时打印标签的散列值和提交对象的散列值 git show-ref --dereference —tags