第一阶段笔记
CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库
比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方
svn是增量(delta)提交,git是全部提交。
git commit命令,-m后面输入的是本次提交的说明
为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;
第二步,使用命令git commit,完成。
:执行git commit -m指令时前提要登陆,执行git config user.name "name" git config user.email "[email protected]"然后再执行git commit -m指令
git status命令可以让我们时刻掌握仓库当前的状态
已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:
要随时掌握工作区的状态,使用git status命令。
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
我们历史记录,在Git中,我们用git log命令查看:
你看到的一大串类似3628164...882e1e0的是commit id(版本号
”回退到上一个版本“add distributed”,就可以使用git reset命令
第二阶段笔记
Git 仓库就是那个.git 目录
Git初始化配置
配置使用git仓库的人员姓名
git config --global user.name "Your Name Comes Here"
配置使用git仓库的人员email
git config --global user.email
[email protected]
可以将工作目录中不希望接受Git 管理的文档信息写到同一目录下的.gitignore 文件中。
echo “zh” > .gitignore
git add .
Git操作一般对应一个仓库,而Repo操作一般对应一个项目,即一个项目会由若干仓库组成
在操作整个Recket项目时使用Repo,而操作其中的某个仓库时使用Git。在包含隐藏目录.git的目录下执行git操作。
在.git目录下有一个config文件,可以修改其中的配置信息。
可以递归添加,即如果后面跟的是一个目录作为参数,则会递归添加整个目录中的所有子目录和文件
撤销git add操作 git reset HEAD file
版本库呢?版本库又名仓库,英文名repository
通过git init命令把这个目录变成Git可以管理的仓库
把一个文件放到Git仓库只需要两步
用命令git add告诉Git,把文件添加到仓库:
用命令git commit告诉Git,把文件提交到仓库
git diff这个命令看看
git reset HEAD <file>取消git add提交
版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看
git log命令显示从最近到最远的提交日志 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数
一大串类似3628164...882e1e0的是commit id(版本号)
用HEAD表示当前版本 上一个版本就是HEAD^,上上一个版本就是HEAD^^ 当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
现在,我们要把当前版本“append GPL”回退到上一个版本“add distributed”,就可以使用git reset命令
找到那个append GPL的commit id是3628164...
git reset --hard 3628164
当你用$ git reset --hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令
hard舍弃所作的修改 soft过去某些提交合并为一个提交
工作区和暂存区
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库
其中最重要的就是称为stage(或者叫index)的暂存区 还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
暂存区(Stage)
用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令
Git同样告诉我们,用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit
id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥
master才是指向提交的,所以,HEAD指向的就是当前分支。
我们创建dev分支,然后切换到dev分支:
git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
用git branch命令查看当前分支
git branch命令会列出所有分支,当前分支前面会标一个*号。
git branch -a 查看所有分支。 git branch -a -vv查看所有分支的详细信息
git merge dev
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -D <name> 强制删除
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:
前面是当前分支的内容,后面是指定分支的内容
用git log --graph命令可以看到分支合并图。
git log --graph --pretty=oneline --abbrev-commit
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场
工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}
销毁失败。Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用命令git branch -D feature-vulcan
git checkout -b dev origin/dev
git push origin dev
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致
。所以,标签也是版本库的一个快照。
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
?但个任意字符*任意字符串 git rm -r --cached name 仅删除仓库中的内容,工作目录中的文件保持不变
git rebase origin/dev # 将你的commits移到的末尾
git fsck --full列出所有未被引用的提交
git cat-file -p 44a329b7cd226785c5f235151d866dabee0f0b46 列出未被引用的提交
在本地建立一个远程仓库的索引 git remote add name url
git remote show name显示远程仓库信息
git fetch后仅仅改变本地远程仓库的分支内容 而本地分支内容并没有改变 git pull = git fetch + git merge
git push git_name src:des git_name远程仓库的名字 src本地分支的名字
把一个空内容push到远程分支,就意味着删除该远程分支
git push git_name :des des前面的SRC为空
暂时回到某个提交 用revert