跳至主要內容

Git

HeChuangJun约 1956 字大约 7 分钟

git代码管理工具

1. 介绍

Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。

git仓库组成部分

  • 工作区(Working Directory):在 Git 管理下的正常目录都算是工作区,我们平时的编辑工作都是在工作区完成。
  • 暂存区(Stage):临时区域。里面存放将要提交文件的快照。
  • 历史记录区(History):git commit 后的记录区。
  • 三个区的转换关系以及转换所使用的命令
    Git仓库组成部分.jpg

2. 项目管理

- 没有仓库时创建仓库并提交代码
echo "# utils" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/HeChuangJun/utils.git
git push -u origin master

- 有仓库时提交代码
git remote add origin https://github.com/HeChuangJun/utils.git
git push -u origin master

- 第二次提交代码
git add .
git commit -m "提交信息"
git push

3. git命令

# 创建版本库
- git clone <ulr> //克隆远程版本库
- git init //初始化本地版本库(当前目录下多了一个.git隐藏目录)

# 修改和提交
- git status //查看文件的提交情况
- git diff [<file>]//查看[文件]变更内容
- git add . //跟踪所有改动文件,提交到暂存区
- git add <file> //跟踪指定文件 文件添加到暂存区.
- git mv <old> <new> //文件改名
- git rm <file> //删除文件
- git rm --cached <file> //停止跟踪文件但不删除
- git commit -m "commit message" //将暂存区的文件添加到仓库
- git commit --amend //修改最后一次提交

- git stash  //暂存。
- git stash pop //恢复最近一次的暂存。
- git stash list//git显示所有备份:
- git stash pop,恢复的备份同时把stash内容也删了
- git stash apply stash@{0} //git恢复单个备份不删除stash的内容:

# 查看提交历史
- git log //显示git最近到最远的提交commit id历史
- git log -p <file> //查看指定文件的提交历史
- git blame <file> //以列表的方式查看指定文件的提交历史
- git show <commit>//查看某次提交内容
- git reflog //显示命令历史
- git log --pretty=oneline //显示git最近一次的commit id历史

# 撤销
- git reset <file> //从暂存区恢复到工作文件。git add <file> 的逆操作。
- git reset --hard HEAD //撤销工作目录中所有未提交文件的修改内容
- git reset --hard HEAD^(^)//回退上(上)个版本
- git reset --hard HEAD~100//回退许多版本
- git reset --hard <commit id>//回退(更新)到指定版本
- git reset HEAD^ :恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改` 。
- git checkout HEAD <file> //撤销指定的未提交文件的修改内容
- git revert <commit> //撤销指定的提交id

# 分支
- git branch //查看所有本地分支,并显示当前分支
- git branch -r //查看远程分支
- git branch <new-branch> //创建新分支 
- git checkout <branch/tag> //切换分支
- git checkout -b <branch> //git创建分支并切换到分支,相当于 git branch <分支名> + git checkout <分支名>
- git branch -d <branch> //删除本地分支
- git push origin :<branch> //冒号删除远程分支

# 标签
- git tag //查看本地所有tag标签
- gti show <tagname>//查看指定标签
- git tag <tagname> [<commitid>] //基于[提交id]最新提交创建标签
- git tag -a v0.1 -m "version 0.1 released" 1094adb //git打标签指定版本和标签的信息:
- git push origin <tagname>//推送本地标签到远程
- git push origin ---tags//把所有未推送的标签推送到远程
- git tag -d <tagname> //删除本地错误的标签
- git push origin :<tagname>//删除远程标签

# 合并与衍合
- git merge <branch> //合并指定分支到当前分支 git status 然后手动处理冲突文件,最后git add <filename> git commit -m <message>
- git rebase <branch> //衍合指定分支到当前分支
- git log --graph --pretty=oneline --abbrev-commit //查看分支合并图
- git merge --no-ff -m "message" <分支名> //合并分支并保存合并历史

# 远程操作
- git remote [-v] //查看远程仓库信息
- git remote show <remote> //查看指定版本远程仓库信息
- git remote add origin <remote> <url>  //添加远程版本仓库
- git fetch <remote> //从远程获取代码
- git pull <remote> <branch> //下载代码并合并 pull = fetch + merge
- git push <branch> //上传代码并合并
- git push <remote>:<branch/tag-name> //删除远程分支或标签
- git push --tags //上传所有标签
- git push origin <branch> :将本地主分支推到远程主分支。失败则 git pull 抓取新提交,有冲突额解决冲突并在本地提交,再推送分支,若提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。建立本地分支和远程分支的关联

# 其他
- [所有]git仓库指定不同的用户名和Email地址:git config [--global] user.name "Your Name"/user.email "email@example.com"

Git 和 SVN 的优缺点?

  • Git 是分布式版本控制系统,SVN 是集中式版本控制系统。
  • SVN的优缺点
    • 优点
      • 安全性比git搞。
      • 代码一致性非常高。
      • 适合开发人数不多的项目开发。
    • 缺点
      • 服务器压力太大,数据库容量暴增。
      • 不能离线工作,因为 SVN 是集中式服务器,如果服务器不能连接上,就不能提交,还原,对比等等。
      • 不适合开源开发。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。
  • Git 优缺点
    -优点
    - 适合分布式开发,强调个体。
    - 公共服务器压力和数据量都不会太大。
    - 速度快、灵活。
    - 任意两个开发者之间可以很容易的解决冲突。
    - 离线工作。
    -缺点
    - 学习周期相对而言比较长。
    - 不符合常规思维。
    - 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
    - 所以,很多公司的开发团队使用 Git 作为版本管理,而产品团队使用 SVN

git如何解决冲突?

  • git stash->git pull->git stash pop 隐藏自己修改的代码,然后把远程仓库的代码拉下来,然后把自己隐藏的修改的代码释放出来,让 Git 自动合并。

什么是 fork 操作?

  • fork ,是对一个仓库的克隆。克隆一个仓库允许你自由试验各种改变,而不影响原始的项目。
  • 一般来说,fork 被用于去更改别人的项目(贡献代码给已经开源的项目)或者使用别人的项目作为你自己想法的初始开发点。
  • 使用 fork 提出改变的一个很好的例子是漏洞修复。fork 这个仓库进行修复并向这个项目的拥有者提交一个 pull requset。如果这个项目的拥有者认同你的成果,他们可能会将你的修复更新到原始的仓库中!
  • 目前很多开源项目,采用 fork + pull request 的方式,实现新功能的开发,Code Review 等等。