原博客地址:
http://24suixinsuoyu.com/2016/07/27/Git-%E5%91%BD%E4%BB%A4%E6%80%BB%E7%BB%93/
git 安装
Git和SVN一样,都需要创建一个服务器的,他们都可以创建自己的版本管理服务器。对于个人和小团队来说,使用托管服务器可能更合适。
常见的有Github 和 Bitbucket。Github没有个人免费仓库使用,代码放上去就是开源的。Bitbucket的个人仓库相关页面已经基本汉化了。注册流程也比较简单。
MAC上最好的GIT免费GUI工具是SourceTree(没有之一)。此外,最好的GIT代码开源网站是GitHub,最好的GIT代码私有库是BitBucket。
安装过程:
1,下载Git installer,地址;http://git-scm.com/downloads
2,下载之后打开,双击.pkg安装
3, 打开终端,使用git –version或者which git命令查看安装版本,有就是安装成功了
4,创建一个全球用户名、全球邮箱,设置全局配置
git config –global user.name “用户名”
git config –global user.email “对应邮箱”
5、进入你的项目目录
转载于 http://www.jianshu.com/p/e9dd2849cfb0
cd d:/wamp/www/wap //首先指定到你的项目目录下
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/youtname/vscode.git
//用你仓库的url,vscode.git中vscode为仓库名称,使用时必须先创建
git push -u origin master //提交到你的仓库
一、Add & Commit
1、add
git init
初始化一个 Git 仓库(repository),即把当前所在目录变成 Git 可以管理的仓库。
git add 文件
把文件添加到 暂存区(stage),可被 track 追踪纪录下来。可多次使用来添加多个文件
git add *
添加所有修改到暂存区
git add .
暂存新增加的和修改的文件,不包括已删除的文件。即当前目录下所有文件。
git add -u
暂存修改的和删除的文件,不包括新增加的文件
git add -i
交互式添加文件到暂存区
git add -p
暂存文件的一部分
2、commit
git commit -m "本次提交说明"
一次性把暂存区所有文件修改提交到仓库的当前分支。注意:提交信息可为中文也可为英文,若为英文则通常用一般现在时。如果不加参数 -m 则会跳转到编辑器强制填写提交说明信息。
git commit -am "本次提交说明"
Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤,参数 -am 也可写成 -a -m。“在 oh-my-zsh 下,直接用 gcam “message” 就搞定了”
. git commit --amend
重新提交,最终只会有一个提交,第二次提交将代替第一次提交的结果。尤其适用于提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了的情况。
git commit --amend --reset-author
在上一次 commit 之后想重新更新一下时间。amend 实际上修改了上一个 commit。所以如果已经 push 了上一个 commit,请尽量不要 amend。如果一定要 amend 已经 push 了的 commit,请确保这个 commit 所在的 branch 只有你一个人使用(否则会给其他人带来灾难),然后在 amend 之后使用 git push –force。只要多加小心,该命令貌似没什么卵用。
git commit -p
commit 文件的一部分,适合工作量比较大的情况。之后,Git 会对每块修改弹出一个提示,询问你是否 stage,按 y/n 来选择是否 commit 这块修改,? 可以查看其他操作的说明。
二、Diff & Status
1、Status
git status
显示当前仓库的最新状态:
- 工作区就是“干净的”,即没有新的修改
- 最上面显示的是在 staging area,有未提交文件时,未被被 commit 的文件;
- 中间显示没有 stage 的修改了的文件,最下面是新的还没有被 Git track 的文件(add)
git status -s 或 git status --short
状态简览。输入此命令后,有如下几种情况
- 文件前面有 ?? 标记 新添加的未跟踪(add)
- 第一个左边的 M 表示该文件被修改了并放入了暂存区。
- 两个MM 该文件被修改了但是还没放入暂存区
2、Diff
git diff
查看工作区中的修改。
git diff --staged 或 git diff --cached
查看暂存区中的修改。
git diff <commit id1> <commit id2>
比较两次 commit 之间的差异。
git diff <branch1> <branch2>
在两个 branch 之间比较。
git diff 文件
查看指定文件具体修改了哪些内容。
git show
查看最后一个 commit 的修改。
git show HEAD~3
查看倒数第四个 commit 的修改,HEAD~3 就是向前数三个的 commit,即倒数第四个 commit
git show deadbeef
查看 hash 为 deadbeef 的 commit 的修改。
git blame 文件
查看谁什么时间改了哪些文件。
三、创建与合并分支
git checkout -b dev
创建dev分支,然后切换到dev分支
git branch
查看当前分支,会列出所有分支,当前分支前面会标一个*号。
git checkout dev
切换回dev分支
git merge dev
合并指定分支到当前分支
git branch -d dev
删除dev分支
三、解决冲突
1、使用git pull文件时和本地文件冲突
场景:在使用git pull代码时,经常会碰到有冲突的情况
简要:主要是使用git stash命令分成以下几个步骤进行处理
git stash
先将本地修改存储起来
git stash list
可以看到保存的信息, stash@{0}就是刚才保存的标记
git pull
获取内容
git stash pop stash@{0}
还原暂存的内容
系统提示如下类似的信息,系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突
Auto-merging c/environ.c
CONFLICT (content): Merge conflict in c/environ.c解决文件中冲突的的部分
<<<<<<< Updated upstream 和=====之间的内容就是pull下来的内容,
====和stashed changes之间的内容就是本地修改的内容。自行确定需要的内容。解决完成之后,就可以正常的提交了。
2、分支合并产生冲突
分支的快速合并命令:
git merge feature1
- 新的feature1分支,继续我们的新分支开发 修改readme.txt最后一行,改为:
Creating a new branch is quick AND simple.
在feature1分支上提交:
$ git add readme.txt
$ git commit -m "AND simple"
[feature1 75a857c] AND simple
1 file changed, 1 insertion(+), 1 deletion(-)
- 切换到master分支:
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
Git还会自动提示我们当前master分支比远程的master分支要超前1个提交
在master分支上把readme.txt文件的最后一行改为:
Creating a new branch is quick & simple.
在master 分支上提交
$ git add readme.txt
$ git commit -m "& simple"
[master 400b400] & simple
1 file changed, 1 insertion(+), 1 deletion(-)
master分支和feature1分支各自都分别有新的提交,
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
直接查看readme.txt的内容
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:
Creating a new branch is quick and simple.
再次提交
$ git add readme.txt
$ git commit -m "conflict fixed"
[master 59bc1cb] conflict fixed
通过 git log 查看到分支的合并情况,
$ git log --graph --pretty=oneline --abbrev-commit
* 59bc1cb conflict fixed
|\
| * 75a857c AND simple
* | 400b400 & simple
|/
* fec145a branch test
...
最后删除feature1分支
$ git branch -d feature1
Deleted branch feature1 (was 75a857c).
四、推送到远程仓库
1、Remote
git remote
查看已经配置的远程仓库服务器
git ls-remote
获得远程引用的完整列表
git remote add <shortname> <url>
添加并关联一个远程库 shortname 一般是 origin,也可以是其他字符串,用来代替整个 url。
git remote rename old_name new_name
重命名一个远程仓库的简写名。
git remote rm <remote-name>
移除一个远程仓库。
2、push
git push -u origin master
关联后,使用该命令第一次推送 master 分支的所有内容,后续再推送的时候就可以省略后面三个参数了,其中参数 u 代表上游(upstream)的意思。
git push origin 远程分支(通常是 master)
推送时也有可能发生冲突,在他人推送之后是不能立即推送自己的修改的,可能会覆盖他人的工作,所以必须先拉取(pull)别人的修改合并(merge)之后才能推送
git push <remote-name> <commit SHA>:<remote-branch_name>
push 一部分 commit。例如:git push origin 9790eff:master 即为 push 9790eff 之前的所有 commit 到 master