1.git介绍
(2).文件的三种状态:
①已修改(modified) :在编码区被修改的文件,还未add到暂存区
②已暂存(staged) :被add到暂存区,但未commit到本地仓库
2.Linux下git操作
(1).安装git客户端步骤:
①命令yum install git 回车 选择y,
②登录www.github.com官网主页,点击create new repository新代码仓库test,选择public类型,
③进入仓库,复制仓库url,在页面右下方HTTPS clone URL,
④回到linux系统创建本地项目文件夹test,进入该文件夹git clone https://github.com/mykine/test.git
回车,就可以将官网服务器上的新建的仓库文件克隆到linux本地test路径下
出错提示:error: Couldn't resolve host 'github.com' while accessing。。。
可能的原因和解决方案:①防火墙限制,使用命令service iptables stop临时关闭防火墙测试一遍即可,开启对应的端口访问
②服务器网关、DNS、路由表等失效,这时ping www.github.com都会失败,显示"unknown host www.github.com",
解决方法参考 http://blog.youkuaiyun.com/jo_andy/article/details/44061085
(2)linux本地git库提交更新的文件到远程git服务器仓库
①在仓库(即工作区)中创建新文件jy.txt,输入内容,保存,
②输入命令git status 查看工作区的状态,可以查看到jy.txt还未被跟踪,
③对新文件jy.txt建立跟踪,命令git add jy.txt
④ 再次使用git status查看状态,可以看到显示“可以通过reset 命令将该次提交撤销掉”
可以通过git commit命令直接提交
⑤提交本次工作区内容变更,命令 git commit
回车,后提示"enter the commit message",即要求填写提交说明,(默认已用vim打开了提交说明文件,i进入编辑模式)填写完说明后,wq保存并退出,这样就完成本地更新提交
⑥确定本地修改的文件可以发布到服务器时,就同步到提交本地到远程服务器仓库,
命令git push ,操作时可能出现以下问题:
出错提示1:error:The requested URL returned error: 403 Forbidden while accessing https://github.com/...
解决办法:编辑工作区目录下的.git下的config文件,vim .git/config,找到[remote "origin"]下的url="https://github.com...",添加github用户名@在url中,即改为url="https://用户名@github.com..."
出错提示2:Gtk-WARNING **: cannot open display:
原因:当前操作所在环境无法打开桌面窗体程序,git push命令之后默认会弹出一个要求输入github登录密码的窗体
解决办法:在git push之前使用命令unset SSH_ASKPASS
⑦git push 回车后输入github帐号密码即可发布本地更新到远程服务器仓库
出错提示:everything up to date
原因:刚创建的仓库是完全空的,不包含任何一个分支(branch),因此第一次push时需要指定一个
解决办法:
首先,执行git remote -v命令看到自己的remote端名字为origin:
origin https://xxxxxxxxx (fetch)
origin https://xxxxxxxxx (push)
其次,执行git branch命令看到当前仓库所在的分支是master:
* master
最后,在本地commit后,用以下命令进行首次push
git push origin master
⑧以后每次修改或新增文件,一般步骤是1)git add 文件或文件夹、2)git commit 、3)unset SSH_ASKPASS、4)git push等步骤进行版本库更新
也可以跳过git add (该指令意义是指将指定被修改的文件添加到暂存区)步骤,直接用 git commit -a 直接将已跟踪过的文件提交
(3)分支操作:
git存储的是一系列文件快照,git每次提交时都会产生一个commit对象,并且会指向上一个提交对象(首次提交除外),分支包含着这系列提交对象形成的链表,而每次提交产生的提交对象会向前移动一格,成为新的表头,表头总是指向最后一次提交对象。
Git 中的分支,其实本质上仅仅是个指向某个commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。
一般master主分支上运行生产环境,在主分支的某个提交对象上根据需求建立子分支进行调试开发,在子分支上开发测试好了后回到主分支进行合并,然后提交更新到主分支生产环境。
使用git时,会存在一个HEAD指针指向当前所在的分支,每次提交后 HEAD 随着分支一起向前移动,git就是通过HEAD指针来识别用户所在的分支的。
命令:
①创建本地新分支:git branch xx分支名称
运行 git branch 命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去,仍然停留在当前分支上,因为HEAD值没有改变
②切换本地分支:git checkout xx分支名称
当执行git checkout XXX命令时,HEAD指针会变更指向XXX分支,用户自然就切换到新分支XXX下了
③创建本地新分支并且切换该分支:git checkout -b xxx新分支名称
创建本地branch对应远端branch:git checkout -b 新本地branch -t 远端别名/远端branch
④删除本地分支:git branch -d xx分支名称
⑤提交本地分支到远程仓库:git push origin xx分支名
⑥删除远程分支:git push origin:xx分支名 (这里的冒号就代表删除)
⑦合并分支:
首先,切回主分支master,git checkout master
然后,使用命令git merge xx分支名称,将xx分支的修改合并到master中,此时master指向最新的提交对象。
(如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,
因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward);
其他情况较复杂,会独立生成一个新的对象最为合并点,指向涉及到的多个分支)
⑧更新远程分支到本地branch列表: git remote update
查看远程分支 git branch -r
查看本地分支 git branch
查看所有分支git branch -a
(3)其他操作:
①.更新远程仓库代码到本地仓库:
首先git status 检查本地文件是否全部提交成功,确保本地文件和即将从服务器上更新到本地的文件不会起冲突
然后 git pull
最后输入git密码更新即可
可能出现的问题: error: Untracked working tree file 'db.sql' would be overwritten by merge.
解决方案:首先git clean -d -fx 清除本地起冲突的文件
然后直接获取远程仓库文件到本地 git pull
如果想获取远程某个分支的代码到本地分支,可以用
(1)git pull 远程仓库别名 远程分支名 本地分支名
不写本地分支名,则默认是当前所在本地分支
(2)本地创建新分支对应远程分支:git checkout -b 新本地branch -t 远端别名/远端branch
git fetch和git pull 都可以更新本地库,关于他们的区别,参考http://blog.youkuaiyun.com/a19881029/article/details/42245955
②.删除远程文件
首先git rm -f xx文件 删除本地文件
然后git commit 提交更新到本地仓库
最后推送到远程仓库删除对应文件git push
如果在本地没有通过git rm方式而是直接删除文件,则无法顺利git commit,这时只要按照文件名创建对应的文件,然后按照以上步骤操作即可。
更改文件名称 也使用git mv ...
③.忽略文件不参与版本控制
创建.gitignore文件,该文件对其所在目录及其子目录均有效。通过将.gitignore文件添加到仓库,其他开发者更新该文件到本地仓库,以共享同一套忽略规则。
.gitignore文件中每一行都是一个规则,基本的语法规则如下:
#以'#'开头的行是注释行,git会忽略它
*.a 忽略对所有以.a结尾的文件的跟踪
!xml.a 但是xml.a除外
/test.txt 仅仅忽略项目根目录下的test.txt文件
pro/ 忽略pro目录下的所有文件
(4)撤销操作
① 取消已经暂存(已执行git add 并且无论是否执行git commit)的文件,文件将变成git add之前的状态
git reset HEAD xx文件
② 取消最后一次commit操作,重新进入提交界面但是本次将使用当前最新的暂存区快照,
如果当前暂存区和上次提交时一样,则这次提交操作相当于重新编辑提交说明。
如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend 提交。
git commit --amend
③ 取消对文件的修改(目标文件要处于git add前的状态),务必谨慎使用此命令,因为
文件将还原为修改前的版本,本次修改的内容将消失
git checkout -- 文件名
参考http://git.oschina.net/progit/ 和 http://git-scm.com/book/zh/v1