git 是一种免费开源的版本控制工具,是由 Linux 发明者 Linus Torvalds 开发,使用 git 可以很方便的进行代码协同开发、版本控制。
git 与 svn
git 是分布式的,svn 是集中式。git 可以把仓库克隆到本地,在自己的机器上进行开发,将代码提交到本地,最后提交到远程仓库;svn 需要从服务器获取代码,开发完之后再提交回服务器,脱离了服务器无法提交。
git 与 github
git 是开源版本控制系统,github 提供基于 git 的代码托管服务, github 上的公开仓库是完全免费的。
Mac 上装好 Xcode 后就会自动安装好 git,在 terminal 输入 git –version 能够看到版本信息就说明已经安装好了
Windows 上安装的方法可以在 git 官网下载安装 git 官网
git config --list - 查看当前的配置
git config --global --add user.name chaoyang805 user.email ****@email.com 添加用户名和邮箱 –global 代表全局
1. 创建/提交 git 项目
git init - 在当前文件夹初始化一个空的 git 仓库. 初始化完仓库是空的,也就是还没有任何工程文件加入到 git 管理.
git status - 查看当前仓库的状态.
git add [filename] - 添加文件到暂存区.
git commit - 进行一次提交
2. 分支操作
master 分支 - 创建仓库后默认所在的分支,也是项目的主分支,其他分支都是从 master 分支的基础上创建出来的,最后也需要合并到master。 git branch [branch-name] - 从当前分支的基础上创建新的分支。 git branch -v - 查看当前仓库的分支(-v 查看详细信息)
git checkout [branch-name] - 切换分支,现在来切换到 develop 分支:
git checkout -b [branch-name] - 这条命令将切换分支和创建分支合在一起,如果不存在就创建:
git branch -d [branch-name] - 删除分支,如果没有合并到 master 会有提示,可以使用 -D 参数强制删除.
git merge [branch-name] - 将指定分支合并到当前分支,下面我们将刚才在develop所做的修改合并到 master:
然后就可以删除 develop 分支了:
3. 撤销修改
三个概念
工作区 - 正在操作的内容属于工作区的 暂存区 - 执行git add 的文件会存入暂存区 历史区 - 保存提交的历史记录
checkout & reset
git checkout \ - 将上一次暂存区的文件覆盖到工作区(上一次 add 之后的初始状态)
下面来做两个演示,
第一:修改1.txt,然后使用 git checkout 命令。来看图:
使用checkout命令后,会发现之前对工作区中做的修改被撤销,打开这个文件也会看到,新添加的内容都没有了。再往下看第二种情况。
第二:修改1.txt,然后将1.txt添加到暂存区,再修改1.txt, 再用git checkout 命令。看图:
这是修改了1.txt 后,第二行内容是刚插入的:
然后git add 添加到暂存区
再修改1.txt的内容,又插入了一行文字,
现在再使用git checkout 命令
这次是第二次添加到1.txt的内容被撤销掉了。
也就是说git checkout命令会把工作区的内容恢复到上次add后的初始状态,add 后再做的修改都会没有
git reset HEAD \ - 将 git add 的内容移除暂存区(将 add 过的内容取消 add)
将刚才 add 的 1.txt 取消add,看下面的图:
reset 不会撤销工作区的内容,只是将add过的内容取消add,如果想要撤销对这个文件的修改,可以继续使用 checkout命令。
git reset \ \ 将 commit 的文件重置到某次提交的时刻,不会改变工作区的内容
现在当前仓库共有两条提交记录,一次 添加 空的 1.txt和2.txt,另一次是modify 1.txt,如图:
现在将 1.txt 重置到第一次commit 的时候,也就是 SHA1 以444369…开头的这次提交:
这条命令同样不会修改工作区的内容,被reset的文件会变成未add的状态这时候只需要用 checkout命令就可以撤销之前做的修改了。
git reset HEAD^ 可以重置到上次提交的状态,在这条commit之后的提交记录都会删除
不加指定的文件,就是对当前整个仓库来做修改,后面一个 ^ 符号表示重置到前一次,重置到前两次就是 加两个 ^ 符号,重置到前面n次的话,可以这样写:git reset HEAD~n。
由于 modify 1.txt这次提交只是修改了1.txt的内容,所以和重置这个文件的效果是一样的,另外再查看git log 的话,会发现 modify 1.txt这条commit已经没有了。
* git revert [commit SHA1] - revert 只会撤销某次提交,在这次commit 之前和之后的 commit 不会受影响,并且revert 需要一个新的commit 来记录这次更改
在当前的仓库中给1.txt 和 2.txt中添加一些内容,并创建一次新的提交:
其中相同颜色的方框和横线表示 commit 对应的1.txt中内容的修改下面来使用 revert命令将 modify 1.txt 的这次提交撤销(revert 命令只可以针对仓库中所有文件,不能只对单一的文件revert):
这时会提示无法revert,需要先解决冲突
打开1.txt,看到下面的内容:
其中 HEAD 以下的内容表示当前1.txt中的内容一直到======;parent of dc31a75 以后的内容表示 dc31a75这次提交以前的内容,这里我们根据需要进行手动合并:
解决完冲突后退出,用 git status 看一下当前状态:
然后git add 添加修改过的文件,可以看到all conflicts fixed: run git revert –continue 这条提示,意思是修复完冲突后运行这条命令来继续 revert。
然后 运行这条命令再创建一个提交来完成当前的revert。
通过git log可以看到新创建的提交标识出了这条提交revert 了 dc31a75。
另外 revert命令也可以用 git revert HEAD 或者git revert HEAD^ 这样的命令来撤销前面某次的提交,用法和reset一样。
4. 关联远程仓库
和github仓库关联
创建 ssh 密钥
ssh-keygen -t rsa -C 'youemailname@example.com'
创建的 ssh 密钥在 ~/.ssh文件夹下
在github 的setting中的SSH and GPG keys里添加 rsa.pub 中的 key 到 github
关联远程仓库
首先创建空的远程仓库
红框里的是刚创建的仓库的ssh链接,然后按照下面的提示来就可以了。下面是一些常用的和远程仓库同步的命令:
git remote add origin ****.git - 添加远程仓库 git push -u origin master - 将本地的 master 仓库推送到远程仓库 git pull origin master - 拉取远程仓库的代码(一般push 之前都要先pull,拉取远程仓库的最新代码,避免出现冲突)