git 学习笔记
svn cvs 集中式版本管理 git 分布式
1:简单介绍:把改动推入(Push)到上游版本库(upstream repository)。
把远程版本库里的改动拿到本地版本库中,需要两步。第一步,把改动取来(Fetch),把远程版本库的版本和分支复制到本地版本库中。第二步,在本地版本库中,把从远程版本库取来的改动与自己本地的改动合并(merge)。
一般说来,取入和合并操作总是先后执行,因此在git中,一个命令(pull)可以完成。
2:主分支(master branch)锁机制。
严格锁(strict locking) :一个人检出(check out )一个文件时,在其(check in)之前,不允许其他人修改。
乐观锁(optimistic locking):基于一个假设,大多数时候大家不同时修改一个文件。
3 :git命令
git config --global user.name “AAAAA” // 全局变量
git config --global user.email “AAAAA@QQ.COM” //邮件地址,以方便联系修改者
git config --global --list //列出上述设置的变量
git config --global color.ui "auto"
git gui //启用git图形界面 gitk //图形化界面,查看版本当前分支历史信息 gitk ——all 可显示全部分支的历史。
gui 和 gitk 后加&符号可以在新进程中运行,不会导致命令窗口死掉。
git help <command> //git-htmldoc
4:亲自建一个项目
(1)mkdir mysite (2)cd mysite(3)git init(4)git add index.html(5)git commit -m "add in hello world HTML"//git commit 创建一个提交记录。书写提交留言。两个-m参数表示两段留言。
(6)git log 可以看到提交的相关信息。(-1 列出最近一个修改的) git log --pretty=oneline //一句话显示
(7)修改文件后,git status //提示git检测到了修改,但还不知道如何处理他们。如果要提交,需要暂存(stage)修改。git中有三个地方可以存放代码,第一个工作目录树,第二个暂存区(索引index),第三个最终的一个是版本库。
(8)git add 暂存 git commit提交
(9)提交留言应该些什么?
3.4理解并使用分支
git branch RB_1.0 master//新分支名称 父分支名称
git commit -a //它告诉git提交全部修改过的文件,弹出的txt文件添加提交留言。
git checkout RB_1.0 切换分支的命令,不同分支上的文件不一样
git tag 1.0 RB_1.0 //为RB_1.0分支的末梢打一个名为“1.0”的标签,git tag //可以查看版本库中的标签列表。
切换到主分支,运行git rebase RB_1.0 可以把RB_1.0分支上的修改合并到主分支上。
变基的意思是“改变分支的基底”,分支A和B,它们的分叉点是版本Y。git的实现方法是,如果站在分支B上告诉git“我要变基到A的末梢”,那么git会把Y到分支B当前末梢之间的所有提交,顺序加到A的末梢上去,生成系的呢分支B,而分支A没有任何变化。
git branch -d RB_1.0 删除分支RB_1.0
从刚才打标签的地方1.0 在创建分支,打补丁git branch RB_1.0.1 1.0
为代码发布创建归档文件rat,zip包。
git archive --format=tar --prefix=mysite-1.0/ 1.0 | gzip >mysite-1.0.tar.gz format指明格式输出 prefix 指明目录 和 1.0标签 产生的tar文件用管道输出的方法传递给gzip进行压缩
git archive --format=zip--prefix=mysite-1.0/ 1.0 | gzip >mysite-1.0.
3.6
git clone 远程版本库的位置 本地目录
4.1暂存
暂存操作将会更新git内部的索引(index),也叫做暂存区(staging area)。通过暂存区,可以设置哪些变更要提交到版本库,哪些先不提交。
git add -i 启动交互命令提示符,交互暂存新文件。
1 status 2 update(暂存) 3 revert(取消暂存)4 add untracked(暂存未跟踪的的文件)5patch(补丁模式) ?帮助 y接受修改 n 忽略修改 a d添加或放弃剩余的修改
git add -p //启动补丁模式 输入y 文件就处于暂存状态并准备提交。
4.2 提交
(1)git add some—file//提交暂存后的修改 git commit -m “changes”
(2)git commit -m “change to some-file” -a//提交工作目录树中所有修改
(3)git commit -m "change to some-file" some-file //提交指定修改
git config --global alias.ci "commit" 起别名 ci==commit
4.3查看修改内容
git diff 比较的使工作目录树与暂存之间的区别
git diff --cached//比较暂存区和版本库的区别
git diff HEAD//可以比较工作目录树与(包括暂存和未暂存的修改)与版本库的区别
git commit -a -m
4.4 管理文件
git mv <原文件名> <新文件名> 也可以:移动文件,git add ,git rm 旧文件
git真正关心的是文件本身的内容,产生一个swap为后缀的临时文件,把文件名加入到版本库的.gitignore文件中,把 “.*.swap”添加到.gitignore文件中。
如果仅仅是本人需要的忽略,就将它添加到.git/info/exclude文件中。
5分支
(1)给分支改名,git branch -m master mymaster//把主分支改名
(2)创建分支 1试验性修改2增加新功能3bug修复
git branch new 创建new分支。git checkout new //检出分支
git checkout -b <新分支> <父分支> //立即检出 提交时,提交到检出分支
(3)直接合并 切换到目标分支,git merge <分支名>
压合合并 将一条分支上的所有历史提交(提交密切相关,新功能,bug修复)压合成,一个提交,提交到另一个分支上
git merge --squash contact//将contact两条提交合并到当前工作区并暂存。
拣选合并//有时候要合并的仅仅是一个提交,这时适合采用拣选合并
git cherry-pick <提交号> //挑选出所要的改动
git reset --hard HEAD^ //删除最后一个提交
git cherry-pick -n //完成拣选,不立即提交,暂存起来,一旦拣选完各个提交运行git commit 命令进行提交。
5.4冲突处理
git merge
<<<<<<< HEAD //当前分支
javascript //冲突内容
=======
duan //冲突内容
>>>>>>> about2 ////待合并分支
简单的手工编辑,复杂的工具kdiff3 mac opendiff
git mergetool 修改后git commit
5.5删除分支
打了标签就可以删除分支。只是删除分支名称而已。
git branch -d about//使用-D操作,git就无须检查要删除分支上的内容是否全部合并过来。
分支重命名
git branch -m contact contacts
6 git log j向下 k向上 q退出
git log 7b1558c / git log -p显示详细信息
6.2 指定查找范围
git log --since=“5 hours”//最近5小时内的提交。
git log --before="5 hours" -1 5小时之前,最后一个提交。
git log <老版本>。。 <新版本> //HEAD表示最新版本, ".."也表示HEAD。
git log --pretty=format:“%h %s” 显示哈希值的缩写及留言的第一行。
git log --pretty=oneline
“18f822e^”一个脱字号作用相当于回溯一个版本, 如果某个节点有并列的多个父节点时,“^1”代表第一个父节点,“^2”代表第二个父节点。
git log -1 HEAD^^^ 和 git log -1 HEAD^~2 和 git log -1 HEAD~3
6.3 查看版本之间差异。
git diff 18f822e 显示和当前目录树的差别
git diff --stat 1.0 统计数据代码改动
6.4跟踪文件
git blame -L 12,13 hello.html
git blame -L 12,+2 hello.html //查看文件hello.html
git blame -L "/<\/body>/",-2 456456e4^ -- hello.html//查看文件hello.html在之前的提交日志
6.5跟踪内容
git blame -M original.txt //检测内容是否重复
git blame -C -C <文件名>//显示文件复制信息
git log -C -C -1 -p
6.6撤销修改
增补提交 处理小错误
git commit -C HEAD -a --amend//增补提交只能针对最后一个提交,-C复用之前的留言,-c修改留言
反转提交,撤销这个提交,或者revert它。
git revert //创建一个反向的新提交
git revert -n//先不要提交,使用于反转多个提交。
复位
git reset head^//复位到head 之前的一次提交
git reset 540ecb7~3 //把版本库复位到 54 的曾祖父节点上,并把54,54的父节点,54的祖父节点上的修改扔到工作目录树中。
--soft 参数可以暂存因复位带来的差异,但不提交它
--hard //慎用,不可以恢复
git reset --hard HEAD^
6.7重新改写历史记录
(1)给历史记录重新排序,让它们看起来更合理。git rebase -i HEAD~3 改变行的位置
(2)将多个提交压合成一个提交。git rebase -i HEAD~3 //将pick改为squash
(3)讲一个大的提交,分解为多个提交
第106页
git rebase -i HEAD~4// edit 开头
git reset HEAD^ git diff
git commit -m git commit -m
git rebase --continue
7.1网络协议
git 最快,ssh安全 https 和http 防火墙
ssh 写入 git只读
git branch -r//显示远程分支和本地分支
7.3同步
git fetch 更新远程分支
git pull 取来,合并
git push
7.5添加新的远程版本库
p98
git pull git://ourcompany.com/dev-erin.git //做一次拖入操作
git remote add <erin> git://ourcompany.com/dev-erin.git
如果一个版本库经常用来接受推入,那么它最好不要有本地改动,最好不要有本地工作目录。
可以在 git init 命令加上参数--bare。
8 管理本地版本库
git tag 1.1 //创建标签
git checkout 1.0 //跑到三不管地带了
git checkout -b from-1.0//创建并检出一个新分支
修改发布版本中出现的bug
git branch RB_1.0.1 1.0 基于标签创建一个新的分支 git checkout RB_1.0.1
修正bug完后, 创建一个新的标签。git tag 1.0.1
git checkout master , git branch -D RB_1.0.1//git不能删除当前检出的分支。
8.4记录和管理多个项目
多个项目共享一个版本库,多项目多版本库。
9 github网站
$ cd your_repo_root/repo_name
$ git fetch origin
$ git checkout gh-pages
派生项目,如果想向一个自己没有权限的项目贡献代码,gihub提倡使用派生(forking)。githu会为你的用户复制一份该项目,使用这个办法米项目维护者不用操心为了推送权限把其他人加为合作者的麻烦。大家可以派生一个项目副本进行推送,而后项目维护者可以把这些副本添加为远程仓库,从中拉取更新的内容进行合并,