大家好! 因为我们公司刚刚从svn转到git上来,很多同事还不太熟悉git的操作,所以给大家准备了一次基础培训,然后也借这个机会,把自己对git的认识整理成技术博客的形式,也算给自己的知识进行一个梳理和沉淀。
首先需要本地电脑上安装了git的命令行工具,并且在git的代码服务器上创建自己的git账号,这些就不详细介绍了。拿到账号以后,我们按下面的方法进行账户配置:
git config --global user.name "Administrator" // 设置自己的用户名
git config --global user.email "[email protected]" // 设置自己的全局邮箱
git config --global core.autocrlf input // 当团队跨平台开发时需要设置
ssh-keygen -t rsa -C "[email protected]" -b 4096 // 会在~/.ssh/里生成ssh的密钥对
ssh -T git@git服务器名
来测试是否可以连接成功本地连接git的远程仓库有3种情况:
git clone http://gitlab.gsoms.com/develop/fronts/xxx/git-project.git // 克隆
cd git-project // 进入本地目录
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
cd existing_folder
git init
git remote add origin http://gitlab.gsoms.com/develop/fronts/xxx/git-project.git
git add .
git commit -m "Initial commit"
git pull origin master --allow-unrelated-histories // 因为本地的版本和远程的版本没有关系,所以需要加上--allow-unrelated-histories来强制更新合并版本
git push -u origin master
cd existing_repo
git remote rename origin old-origin
git remote add origin http://gitlab.gsoms.com/develop/fronts/h5/git-project..git
git push -u origin --all // 推送所有的分支以及commit
git push -u origin --tags // 推送所有的tag
本地工作目录下面的文件状态不外乎两种:已跟踪或未跟踪。已跟踪状态下的文件在工作了一段时间以后,它们的状态可能处于未修改,已修改或已放入暂存区。状态的变化可以用下面的UML图来表示:
git status // 查看当前文档的状态
git add . // 暂存已经修改的文件或者未跟踪的文件
git commit // 提交已经暂存的文件,这里面只会提交已经暂存的修改,暂存以后修改的内容不会被提交
git commit -a -m "提交的注释" // 跳过暂存区,提交所有的文件
git diff // 比较工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。
git diff --staged // 查看已经被暂存的变化(将要添加到下次提交里的内容)
git rm --cached README // --cached可以把文件从 Git 仓库中删除(即从暂存区域移除),但仍然希望保留在当前工作目录中。
git rm log/\*.log // 删除log/目录下扩展名为.log的文件
git rm \*~ // 删除以~结尾的所有文件。
git diff本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动
而带上 –staged 则会显示暂存文件的改动
如果你提交代码时,漏了几个文件没有提交,或者提交的信息写错了,可以像下面一样操作:
git commit -m 'initial commit'
git add forgotten_file
git commit --amend // 会提示让你重新输入提交的信息
如果你希望取消暂存的文件,因为想分开来提交代码,可以用reset命令:
git add *
git status
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
git reset HEAD CONTRIBUTING.md // 可以取消暂存的文件
Unstaged changes after reset:
M CONTRIBUTING.md
分支这个概念很常用:比如开发某一个新的功能,但是老的功能又希望继续开发,这时候就会很容易想到创建一个新的分支。或者写着新的功能,老的功能突然被发现了紧急的bug需要修复等等。
git branch -b {{branch}} // 创建一个新的分支,并且切换到新的分支上去
git push origin {{branch} // 推送到远程分支,远程分支名和本地分支名相同
git fetch origin // 从服务器上抓取数据,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并。
git merge origin/{{branch}} // 将远程的工作合并到当前所在的分支
git pull origin {{branch}} // 获取远程分支代码并且合并分支
如果想要显示的更改本地分支所跟踪的远程分支,可以使用 -u或者 --set-upstream-to选项
git branch -u origin/serverfix
可以通过git branch -vv
来查看所有分支的信息,如:每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后
如果你想删除分支的话,可以用 -d
来删除
git branch -d dev // 删除本地dev分支
git push origin -d dev // 删除远程dev分支
首先,项目存在两个长期分支:
master 主干 — 主要存放对外发布的版本,任何时候都要保证主干的代码是正确、可用的
develop 开发 — 存放最新的开发版本
其次,项目存在3个短期分支:
功能分支(feature branch)— 当有新的功能需要开发时
补丁分支(hotfix branch)— 当主干上有紧急的bug需要被修改
预发分支(release branch)— 当功能都已经开发完,准备上线,进行集成测试时
这些分支在结束之后会被合并到develop和master上
关于git-flow的流程,参考这里