赞
踩
在集中化的版本控制系统中,诸如 CVS、Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。 多年以来,这已成为版本控制系统的标准做法。
缺点:
在分布式版本控制系统中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
优点:
Git是目前最快、最简单也最流行的分布式版本控制系统!
在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。 因为你在本地磁盘上就有项目的完整历史,所以大部分操作看起来瞬间完成。
Git 中所有的数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:
24b9da6552252987aa493b52f8696cd6d3b00373
Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

在Windows上安装比较简单,按默认选项安装即可。验证是否安装成功,dos命令:
$ git --version
$ git config --global user.name "zhoumei"
$ git config --global user.email 952409683@qq.com
$ git config --list
$ git config --global --list
$ git init
$ git init [project-name]
$ git clone [url]
“origin”是当你运行 git clone 时默认的远程仓库名字。 如果你运行 git clone -o booyah,那么你默认的远程分支名字将会是 booyah/master。
$ git remote
$ git remote -v
$ git remote show [remote]
$ git remote add origin https://gitee.com/zhoumgt/project01.git
$ git remote remove origin
ssh-keygen -t rsa -C "952409683@qq.com" -f "gitee"
执行完命令后,会在.ssh文件夹下生成两个文件:gitee、gitee.pub(gitee是本地私钥,gitee.pub是要在Gitee上配置的公钥):
在~/.ssh文件夹下添加config文件(目的是解决SSH冲突)
#gitee
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitee
$ git push -u origin master
$ git pull [remote] [branch]
$ git push [remote] [branch]
所有命令都必须在Git仓库的根目录下执行。
$ git status
$ git add [file]
$ git add [dir]
$ git add .
$ git mv [file-original] [file-renamed]
$ git rm [file]
$ git rm -r [dir]
$ git commit -m [message]
$ git commit [file1] [file2] ... -m [message]
$ git commit -a -m [message]
$ git log
$ git log --pretty=oneline //将每个提交放在一行显示
$ git reflog
暂存区和未追踪的新增文件保持不变
$ git restore [file]
$ git restore .
$ git checkout [版本id] [fileName]
工作区的内容保持不变
$ git restore --staged [file]
$ git restore --staged .
$ git stash
$ git stash pop
$ git reset --hard
$ git reset --hard HEAD^
$ git reset --hard HEAD^^
$ git reset --hard [版本id]
备注:
git reset --soft 版本id:回退到某个版本,只回退了commit的信息,该提交包含的更改变为modify状态,如果还要提交,直接commit即可;
git reset --hard 版本id:彻底回退到某个版本,工作区和暂存区的更改都将被撤销;
$ git branch
$ git branch -r
$ git branch -a
$ git branch [branch]
$ git checkout -b [branch]
$ git push -u origin [branch]
$ git checkout -b [本地分支名] origin/[远程分支名]
$ git branch --set-upstream-to=origin/[远程分支名称] [本地分支名称]
$ git checkout [branch]
$ git branch -d [branch]
$ git push origin --delete [branch]
工作场景描述:
从远程master分支clone项目到本地(本地自动生成master分支与远程master分支进行关联);
在本地新增开发分支zhoumei,推送到远程个人分支zhoumei;
在本地开发分支开发代码,提交并推送到远程个人分支,待功能开发完成后,申请合并代码(从远程个人分支合并到远程master分支),完成开发。
提交完要提交的代码
$ git commit -m 'xxx功能开发完成'
把改动但不需要提交的文件,放到缓存区
$ git stash
查看文件变更状态,确认改动的文件全部放到缓存区
$ git status
从远程master分支更新代码到当前分支(自动merge)
$ git pull origin master
如果有冲突文件,解决冲突(手动合并)
冲突文件手动合并完成后,提交所有要提交的文件
$ git add .
$ git commit -m '解决xxx合并冲突'
推送到远程个人分支zhoumei
$ git push oringin zhoumei
在远程个人分支发起代码合并请求,通知负责合并代码的人,完成代码合并
恢复缓存中的文件
$ git stash pop
像其他版本控制系统(VCS)一样,Git 可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点( v1.0 、 v2.0 等等)。标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
$ git tag
$ git tag [tag]
$ git tag [tag] [版本id]
$ git show [tag]
$ git push [remote] [tag]
$ git push [remote] --tags
$ git tag -d [tag]
$ git push [remote] --delete [tagname]
$ git checkout -b [branch] [tag]
配置git
Settings-> Version Control-> Git,Path to Git execultable修改为:安装根目录\bin\git.exe。点击Test进行测试:
执行命令
在Terminal窗口执行git命令:

解决控制台中文乱码:
修改控制台shell路径:Settings-> Tools -> Terminal,Shell path修改为:安装根目录\bin\bash.exe
在idea安装目录下找到idea.exe.vmoptions和idea64.exe.vmoptions文件,在文件的最后添加:
-Dfile.encoding=UTF-8
在git安装目录下找到etc/bash.bashrc文件,在文件的最后添加:
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
退出控制台,重新进入即可。
提交&推送:
VCS-> Commit-> Commit and Push-> 输入远程仓库的账号和密码。
颜色提示:
红色:未加入版本控制
绿色:已加入版本控制,未提交
蓝色:已加入版本控制,已提交,有修改
白色:已加入版本控制,已提交,未修改
有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在Git仓库的跟目录创建一个名为 .gitignore 的文件,列出要忽略的文件。
# 忽略所有的 .a 文件 *.a # 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件 !lib.a # 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO /TODO # 忽略任何目录下名为 build 的文件夹 build/ # 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt doc/*.txt # 忽略 doc/ 目录及其所有子目录下的 .pdf 文件 doc/**/*.pdf
欢迎大家访问我的博客:随风飘雁的博客

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。