git
的一些注意事项
- 需要说的是git不同于svn,git是分为
本地仓库
与远程仓库
的,我们平常的操作都是通过对本地仓库
完成的
- 只有需要将本地仓库的内容
push
到远程仓库或从远程仓库更新
时 才会和远程仓库发生联系 - 所以不需要象svn那样时刻都需要有网才能
commit
,我们可以直接只操作本地仓库就可以了 - 同时一个文件的状态对于git来说是存在于
git的工作目录
, 暂存区
, 本地仓库
3个状态的 - 我们使用svn或cvs时 只要从工作目录
commit
到中心仓库就可以了 - 但是由于git存在暂存区,所以在git这里,只有通过
add
命令被添加到暂存区的文件,才可以commit 到本地仓库.
关于git
的安装
- 由于大多数人都是windows的系统 所以我们这里只列出了windows的安装,其他系统可以自己度娘
- 可以由http://msysgit.github.io/ 下载相应安装程序进行安装 中间的选项默认就好
- 如果你不使用其他git管理工具,请更改如下操作
- msysgit的安装目录中的
etc/git-completion.bash
文件增加alias ls='ls --show-control-chars --color=auto'
- 编辑
etc/gitconfig
在文件中的[core]
部分添加如下部分quotepath = false
- 在
profile
中增加一行 export LESSCHARSET=iso8859
- 以上3条操作都是为了防止一些显示及提交的中文乱码等问题
关于git
的配置
git config --global user.name "sampson"
git config --global user.email "pojo888@126.com"
- 可以通过如上命令添加自己的用户名及邮箱地址
- 每次 git 提交时都会引用这两条信息,说明是谁提交了更新
--global
选项说明以后你所有的项目都会默认使用这里配置的用户信息- 如果要在某个特定的项目中使用其他名字或者邮件,只要
去掉--global
在当前目录配置即可,新的设定保存在当前项目的.git/config 文件里 git config --list
命令用来查看当前的配置.
关于git
的一些基本命令
- git可以新建一个git项目目录,也可以从已有的git远程仓库中
clone
一个项目 - 注意 这不是
checkout
的概念,checkout在git的世界中是切换分支版本
的概念,以后会用到
git init
对现有的某个项目目录开始用 git 管理,命令运行后会生成一个名为 .git 的目录,所有 git 需要的数据和资源都存放在这个目录中.git clone
对已有的远程仓库进行clone复制,也会生成 .git目录
git add
把文件加入到前面提到的暂存区git commit
把暂存区中的文件提交到本地仓库中去git push
把当前本地仓库的某个分支推送到远程仓库中- 例如
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin ssh://192.168.1.58:10022/doc/gitdoc.git
git push -u origin master
-m
选项为本次提交的快速注释方式(没有提交注释是不会被git允许的)git remote add
为添加一个前文提到的远程仓库(需要远程仓库创建了此裸仓库)
- 其中
origin
为远程仓库的别称,惯例用这个名称,你也可以根据需要起不同的名字 - 远程仓库用到了ssh的方式需要ssh的key存在于远程仓库的管理系统中,在gitlab使用中会进行介绍
ssh key
参见 gitlab 使用说明
- push 命令会把刚才通过
init
命令新建的本地项目(默认为master
分支) push到远程仓库
-u
参数是指存在多个远程仓库时 指定一个默认主机,这样后面就可以不加任何参数使用git push- 关于
push
的详细使用参见git push 的使用
- 此时 另外一个用户即可通过
clone
从远程仓库下载了
git clone -c http.sslVerify=false https://192.168.1.58/git/doc/gitdoc.git
(注意这里使用了https,意味着push时需要输入你在网站注册的用户名及密码)
- 然后我们可以 通过
edit
--> add
--> commit
--> push
的方式进行相应的操作
- 当然我们也可以跳过add ,就是通过选项
–a
- git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
git commit –a –m 'update xxx'
关于git
的分支相关的命令
- 分支是git的最大魅力,同时实现分支比svn要容易且快速
- 而合并分支又是svn所不具有的功能
git branch sampson
就会在本地新建一个当前项目的samposn分支
- 我们可以把sampson 想象成windows中的系统还原点,如果我现在什么都不做
- 我任何时间切换到sampson这个分支都会对应当前的项目状态,当然前提是在这个分支上没有做任何提交
- branch sampson 并不会切换到sampson分支, 我们需要显式的使用 git checkoutsampson切换到sampson分支
- 当然也可以直接使用 git checkout –b sampson 创建并切换到sampson分支
git fetch origin
会抓取远程仓库 origin 的更新到本地 包括远程仓库的各个分支版本
- 但是注意
fetch
并不会把这些更新融合到你的本地仓库分支中去.
git merge origin/master
就是把远端的master分支 融合到你当前的分支中,如果有冲突 则需要自己解决git pull
命令是指针对远程仓库的分支包含了 fetch 与 merge 合二为一的一个操作
- 当我们在sampson分支做过一些提交后 我们就可以把这个分支融合到master分支
- 这里是从master 融合sampson,如果期间master有提交 那么就会据此产生一个新的版本
- 即master所指向的HEAD 指针会向前进一个版本.git 中分支的融合
git checkout master
git merge sampson
git rebase master
在sampson分支中git rebase master sampson
在master分支中
- huaxj 会寻找自己与master的共同祖先节点
- 并把基于这个节点之后的所有差异化操作在master版本上重新演绎一遍
- 然后生成一个HEAD指针在master的下一个版本的节点(同时删除了自己自共同祖先节点以来的的分支节点)
- 这个节点是sampson分支的,master并没有改变,如果需要合并还是需要master merge操作
- 但是这样的操作 会使得版本提交的历史看起来更流畅与线性
- 还有更重要的一点是在rebase master的过程中,如果有版本冲突,那么就需要执行rebase的分支进行相应处理
- 这一点在操作远程仓库时尤为明显, 先在自己的一个本地分支里进行开发
- 当准备向master提交的时候,根据最新的origin/master 进行一次rebase操作后再提交
- 这样master维护者就不需要做任何整合工作 直接顺利merge
- 等于你替他把他需要处理的可能出现的冲突都已经先摆平了,谁都会喜欢这样pull request~
rebase --onto master sampson john1
- 理解方式可以是把 [--onto master] 去掉,即以sampson 和john1的共同祖先rebase john1
- 但目标结果到master上.有点难以理解,可以自己尝试下
- 但是rebase 有个最大的
潜在问题
就是关系到远程仓库的
- 一定
不要
把自己已经提交到远程仓库的分支
给rebase掉
- 原因就是上面提到的rebase会删除自己同rebase目标分支共同祖先节点以来的的分支节点 然后生成一个新的HEAD节点
- 所以如果已经提交到远程仓库的分支被rebase掉了,很可能有别人已经基于这个分支做了merge以及新的开发
- 那么git提交的历史将变的一片混乱,这种事做出来会人神共愤的
- 我在haxe openfl小组就遇到过这样的情况,大家会相当崩溃.....
- 因为过于痛苦,所以master版本及一些重要分支都是锁定的,只有通过pull request 进行处理
关于git
的其他命令
- 没有提供详细的说明 自行度娘吧 另外一些可视化git工具都可以做这些命令的处理
git rm
命令删除一个文件,那么这个文件就会从被跟踪文件中移除
- 如果只是手动删除文件那么git会认为这个文件发生了改变但未更新
- 其实想想 为什么有
git add
就明白与之对应的要有 git rm
命令了
git mv
命令可以进行文件的移动和重命名git log
命令可以查看详细的提交历史,并且提供了过滤选项git status
命令可以列出修改过的文件git diff
命令可以查看暂存区与本地目录文件的区别.git commit –-amend
命令 用于重新提交,处理上一次提交的错误git reset HEAD
命令用于取消已暂存的文件git remote –v
可以列出所有的远程仓库git remote show origin
可以查看远程仓库的信息git remote rename aa bb
会把远程仓库名aa 变为bbgit tag
命令会列出所有标签git tag –l '1.0.*'
会列出对应筛选结果git tag –a v1.0beta –m '1.0 beta'
建立注解标签git show v1.0beta
可以查看相关信息git push origin v1.0beta
标签如果想要加入到远程仓库同样需要pushgit push origin --tags
如果新建了多个标签,也可以一次推送通过如下命令git reset
版本回退
- 如果你运行一个
git reset -help
会得到一个比较烧脑的帮助信息 - 这个说起来…. 好吧 太复杂了,我都没信心看下去,具体需要的时候再查资料吧
- 我基本 只会 而且是很少用到
git reset --hard commitId
退回某commit 版本git reset --hard HEAD^
(HEAD ^ 就是父节点 ^ ^ 就是父节点的父节点) 你可能会说,我靠 这要是父节点………N回…- 用
git reset --hard HEAD~3
就好了 git reset --hard HEAD^ check.java
只回退某个文件- 以及我以前会最常用的
git reset --hard origin/master
QQ群:131783959