git简介与操作指引

一、svn/git差异 (集中式VS分布式)

1、个人使用经验

国内代码仓库:osc, coding, csdn(已转移到osc), .gitignore svn目录属性 .git .svn(多个)

pull/push压缩(Git 克隆一个完整项目的速度非常快,SVN 非常慢) 分支/tag 指针(git开分支的代价很小 更换分支快 git仓库不冗余 SVN为拷贝留存一份)

2、分布式

GIT是分布式的,SVN不是 GIT把内容按元数据方式存储,而SVN是按文件 GIT分支和SVN的分支不同 GIT没有一个全局的版本号,而SVN有 (使用GIT的SHA-1 SVN里容易阅读的数字版本号) GIT的内容完整性要优于SVN (GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性)

3、离线

不必联网就可以看到所有的历史版本记录,而SVN 却需要联网 SVN 断开网络或者断开VPN就无法commit代码,但是Git 可以先commit到本地仓库

4、git 的缺点

工作目录只能是整个项目。比如 checkout,建分支,都是基于整个项目的。而 svn 可以基于项目中的某一个目录

Git 没有严格的权限管理控制,一般通过系统设置文件读写权限的方式来做权限控制。

5、git适用场景

适合: 源代码 (文本可压缩 琐碎文件) 管理用svn, 代码用 git

不适: 大文件、安装包、美工PSD 大量媒体设计混合到程序的项目

二、基础原理

##通用模式 本地仓库、远端仓库 HEAD/master, branch, tags (origin pull/push)

本地操作 工作区、暂存区、历史区 (add,commit, reset, checkout)

1.简化使用 不关注暂存区,改动代码后 add, commit 2.checkout适用于多分支模式开发(feature多版本功能并行开发,release多版本并行提测,多版本部署/app端应用包)

##深化应用

###git stash

用于保存和恢复工作进度。

git stash   保存当前的工作进度。会分别对暂存区和工作区的状态进行保存。 git stash list   显示进度列表。此命令显然暗示了git stash 可以多次保存工作进度,并用在恢复时候选择。

git stash drop

其他: git stash pop [--index] git stash save “message...” 这条命令实际上是git stash命令的完整版。

git stash apply [--index] 除了不删除恢复的进度之外,其余和git stash pop 命令一样。

###git reset Git最常用的命令之一,也是最危险最容易误用的命令。

git reset --soft HEAD^

工作区和暂存区不改变,但是引用向前回退一次。当对最新的提交说明或者提交的更改不满意时,撤销最新的提交以便重新提交。

git reset --hard HEAD^

彻底撤销最近的提交。引用回退到前一次,而且工作区和暂存区都会回退到上一次提交的状态。自上一次以来的提交全部丢失。

修补提交命令git commit --amend,用于对最新的提交进行重新提交以修补错误的提交说明或者错误的提交文件。修补提交命令实际上相当于执行了下面两条命令。(注:文件.git/COMMIT_EDITMSG保存了上次的提交日志) git reset --soft HEAD^ git commit -e -F .git/COMMIT_EDITMSG       git reset HEAD^ / git reset --mixed HEAD^ 工作区不改变,但是暂存区会回退到上一次提交之前,引用也会回退一次。

###git checkout 检出命令,也是一个很危险的命令,因为这条命令会重写工作区。 

###git rebase git rebase -help/--help(browser)

###git merge git merge --squash 从当前分支和对方分支的共同祖先节点之后的对方分支节点将会压缩在一起,产生一个新的节点。 git merge -Xignore-space-change whitespace
-Xignore-all-space 或 -Xignore-space-change 选项。 第一个选项忽略任意 数量 的已有空白的修改,第二个选项忽略所有空白修改。

##高级用法

###git config高级篇

Git中的着色 $ git config --global color.ui true

外部的合并与比较工具

格式化与空白 git config --global core.autocrlf true

commit.template

###git高级技巧1: 合并多个提交 假设要合并最后的2个提交,可以按如下命令进行: git rebase –i HEAD~2

修改提交日志 git commit --amend

放弃本地修改后更新 git reset --hard git pull

制作补丁 应用patch: 先检查patch文件:git apply --stat newpatch.patch 检查能否应用成功:git apply --check newpatch.patch 打补丁:git am --signoff < newpatch.patch

###git高级技巧2:

  1. 使用rebase而非merge来拉取上游修改

分支合并会被记录为一次合并提交,这种做法是很有意义的。比如说,可以通过这种方式来标识一个新特性被合并到了发布分支中。不过,当多个团队成员工作在一个项目中并使用常规的git pull来同步分支时,提交时间线就会被不必要的合并提交所污染。 冲突: 可以运行git rebase --abort来完全取消变基。这么做会取消变基修改,并将分支置回到执行git rebase之前的状态。 可以运行git rebase --skip来完全忽略该提交。这样,有问题的提交所引入的变化就不会被添加到历史中。 可以使用与合并冲突相同的标准步骤来解决冲突。

  1. 临时性保存修改 在工作进行中时,有些东西常常会处于凌乱的状态。如果这时需要切换到不同的分支该怎么办呢?Git是不允许你这么做的,因为还有尚未保存的修改。坦率地说,你并不想将半成品提交上去,后面再来修改。这个问题的解决之道就是使用git stash命令。 $ git stash save "describe it" # give the stash a name $ git stash clear # delete a stashed commit $ git stash save --keep-index # stash only unstaged files

  2. 将cherry-pick远程提交合并到自己的分支中 更有甚者,如果只想将远程仓库的一个特定提交合并到自己的分支中该怎么做呢?可以使用git cherry-pick 来选择给定SHA值的提交,然后将其合并到当前分支中: $ git cherry-pick xxx

  3. 应用来自于不相关的本地仓库的补丁 如果需要将另一个不相关的本地仓库的提交补丁应用到当前仓库该怎么做呢?答案就是下面这条命令: $ git --git-dir=/.git format-patch -k -1 --stdout | git am -3 -k

  4. 忽略追踪文件中的变更 如果你和你的同事操纵的是相同分支,那么很有可能需要频繁执行git merge或是git rebase。不过,这么做可能会重置一些与环境相关的配置文件,这样在每次合并后都需要修改。与之相反,你可以通过如下命令永久性地告诉Git不要管某个本地文件: $ git update-index --assume-unchanged

9.将子目录分隔为新的仓库 有时,你可能需要将Git仓库中某个特定的目录转换为一个全新的仓库。这可以通过git filter-branch来实现:

$ git filter-branch --prune-empty --subdirectory-filter  master
# Filter the master branch to your directory and remove empty commits
Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (89/89)
Ref 'refs/heads/master' was rewritten

现在,仓库会包含指定子目录中的所有文件。虽然之前的所有文件都会被删除,但他们依旧存在于Git历史中。现在可以将新的本地仓库推送到远程了。

  1. 清理 有时,Git会提示“untracked working tree files”会“overwritten by checkout”。造成这种情况的原因有很多。不过通常来说,我们可以使用如下命令来保持工作树的整洁,从而防止这种情况的发生: $ git clean -f # remove untracked files $ git clean -fd # remove untracked files/directories $ git clean -nfd # list all files/directories that would be removed

  2. 将项目文件打成tar包,并且排除.git目录 有时,你需要将项目副本提供给无法访问GitHub仓库的外部成员。最简单的方式就是使用tar或zip来打包所有的项目文件。不过,如果不小心,隐藏的.git目录就会包含到tar文件中,这会导致文件体积变大;同时,如果里面的文件与接收者自己的Git仓库弄混了,那就更加令人头疼了。轻松的做法则是自动从tar文件中排除掉.git目录: $ tar cJf .tar.xz / --exclude-vcs

  3. 查找修改者 最后,如果出现混乱的情况,你一定想要找出是谁造成的。如果生产服务器宕机,那么找到罪魁祸首是比较容易的事情:只需执行git blame。该命令会显示出文件中每一行的作者,提交hash则会找出该行的上一次修改,还能看到提交的时间戳: $ git blame xxx

###Git hook 钩子 客户端钩子 客户端钩子分为很多种。 下面把它们分为:提交工作流钩子、电子邮件工作流钩子和其它钩子。

服务器端钩子 除了客户端钩子,作为系统管理员,你还可以使用若干服务器端的钩子对项目强制执行各种类型的策略。 这些钩子脚本在推送到服务器之前和之后运行。 推送到服务器前运行的钩子可以在任何时候以非零值退出,拒绝推送并给客户端返回错误消息,还可以依你所想设置足够复杂的推送策略。

三、命令操作

clone从仓库拿取代码: git clone https://git.ym/xxx/xxx.git

改动文件后提交到本地REPO add,commit: git add -A . (git add . 不提交删除; git add -u 只提交tracked file) git commit -m "xxx"

从远端拉取更新,并推送以远端 pull,push: git pull
git push (-u, --set-upstream)

四、工具操作

##TortoiseGIT

使用过TortoiseSVN的更熟悉。只提供Windows版本,提供中文版支持。 ###操作:clone 

###操作:add,commit 

###操作:设置user, email 

###操作:pull,push 

###操作:auth, 免密同步 

##SourceTree SourceTree是老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具。基本操作和高级操作都设计得非常流畅,适合初学者上手。 ###操作:clone

###操作:管理界面 

##smartGIT JAVA语言实现,跨平台

###操作:管理界面 

五、IDE操作

1、IDEA

###操作:clone 

###操作:拉取远端更新 

###操作:commit push 

###操作:push 多个commit 

##2、ECLIPSE

###操作:在GIT视图面板 clone远端代码 

###操作: 导入项目到工作空间 

###操作:commit, pull/push 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值