Git基础
分布式版本控制工具
初始化本地库
git init
在要初始化的目录下右键 Git bash进入, 输入命令

查看状态
git status

表明文件还只存在工作区, 没有被跟踪
将文件添加到暂存区
git add filename

文件被添加到暂存区后, 显示如上图所示, 文件名变成了绿色
将文件从暂存区删除
git rm --cached filename
不会删除本地库的文件, 只会删除暂存区的文件
取消暂存的文件
git reset HEAD <file>...
$ git add *$ git statusOn branch masterChanges to be committed:(use "git reset HEAD <file>..." to unstage)renamed: README.md -> READMEmodified: CONTRIBUTING.md$ git reset HEAD CONTRIBUTING.mdUnstaged changes after reset:M CONTRIBUTING.md$ git statusOn branch masterChanges to be committed:(use "git reset HEAD <file>..." to unstage)renamed: README.md -> READMEChanges not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified: CONTRIBUTING.md
提交本地库
git commit -m "log message" filename"git commit -a -m "log message" filename" # 不需要添加到暂存区
使用以上的命令, 将暂存区的文件提交, -m 后面添加日志信息
修改文件后提交
在本地库中修改文件后, 需要使用git add filename再次跟踪文件, 然后再使用git commit… 命令将文件提交
覆盖上次的提交
$ git commit -m 'initial commit'$ git add forgotten_file$ git commit --amend
版本穿梭
git reset --hard versionid 放弃所有的历史, 改回指定提交
引用回到versionid, 工作区和暂存区会退回到versionId的状态, 自versionId以来的提交全部丢失
文件的撤销和版本的回退
git checkout --file_name利用暂存区的文件覆盖工作区的文件git checkout head --file_name利用head所指的commit版本覆盖工作区, 暂存区git reset head --file_name利用head所指的commit版本覆盖暂存区的文件git reset --hard [head^](回退到上一个版本)[commit_id](回退到某一版本)...回退到某一版本, 工作区和暂存区的文件也会回去git reflog查看所有的log信息
打标签
Git支持两种标签:
- 轻量标签(lightweight)
作为临时标签使用
- 附注标签(annotated)
是Git中完整的对象, 可以被校验的, 其中包括打标签者的名字, email, 日期, 还有一个标签信息.
列出所有的标签
git taggit tag -l "v1.8.5*" //使用通配符查找以v1.8.5开头的标签
创建标签
$ git tag -a v1.4 -m "my version 1.4" # 附注标签$ git tag v1.4-lw # 轻量标签$ git tagv0.1v1.3v1.4
通过使用 git show 命令可以看到标签信息和与之对应的提交信息
$ git show v1.4tag v1.4Tagger: Ben Straub <ben@straub.cc>Date: Sat May 3 20:19:12 2014 -0700my version 1.4commit ca82a6dff817ec66f44342007202690a93763949Author: Scott Chacon <schacon@gee-mail.com>Date: Mon Mar 17 21:52:11 2008 -0700changed the version number
后期打标签
$ git log --pretty=oneline # 查看log9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme$ git tag -a v1.2 9fceb02# 后面六位是校验和
共享标签
git push不会传送标签到远程库上, 需要手动在命令后添加
$ git push origin v1.5
删除标签
$ git push origin --delete <tagname>
Git别名
分支操作
基本命令
git branch branch_name 创建分支git branch -v 查看每个分支的最后一次提交git checkout branch_name 切换到指定分支git checkout -b branch_name 创建新的分支,并切换过去git merge branch_name 将指定的分支切合并到当前的分支git branch --merged/no-merged 查看已经已经合并/没有合并的分支git branch -d branch_name 删除指定分支git diff [first-branch]...[second-branch] 展示两个分支之间的内容差别git log --oneline --decorate 查看各个分支当前所指的对象git lon --oneline --decorate --graph --all 输出提交历史, 各个分支的指向以及项目的分支情况

在Second版本时创建一个hot-fix分支, 此时Master和hot-fix分支都指向second版本, head指向master分支, 可以使用分支转换命令切换到hot-fix分支, 此时在版本上的操作结果只存在于hot-fix, 对Master分支没有影响, 如果再切换到master分支, 那么当前的版本还是second, 如果再使用分支合并命令, 在master分支上, 将hot-fix分支合并, 那么此时的master指向hot-fix指向的版本, 产生一下两种结果, 没有冲突和有冲突
分支合并没有冲突
正常合并, 不产生错误的结果
分支合并有冲突
<<<<<<< HEAD:index.html<div id="footer">contact : email.support@github.com</div>=======<div id="footer">please contact us at support@github.com</div>>>>>>>> iss53:index.html
这表示 HEAD 所指示的版本(也就是你的 master 分支所在的位置,因为你在运行 merge 命令的时候已经检出到了这个分支)在这个区段的上半部分 (======= 的上半部分),而 iss53 分支所指示的版本在 ======= 的下半部分 。 为了解决冲突,你必须选择使用由 ======= 分割的两部分中的一个,或者你也可以自行合并这些内容。 例如,你可以通过把这段内容换成下面的样子来解决冲突:
<div id="footer">please contact us at email.support@github.com</div>
需要将其中的<<<<<,======删除
合并分支时, 两个分支在同一个文件有两套完全不同的修改, Git无法决定, 那么这时候需要人为的决定
团队协作
团队内协作

跨团队协作

远程库
给远程库起别名
git remote add alias url(自己的远程库连接)
远程仓库的重命名
git remote rename old_name new_name
值得注意的是这同样也会修改你所有远程跟踪的分支名字。 那些过去引用 pb/master 的现在会引用 paul/master
移除远程仓库
git remote remove paul
查看远程库别名和url
git remote -v
将本地分支推送到远程库
git push alias(远程库别名或者是连接) local_branch(本地分支名)
首先始要使用git add, git commit 将文件提交到本地库, 然后再使用上面的命令, 否则会报错
将远程库拉取到本地库
git pull alias local_branch [--allow-unrelated-histories]git fetch alias
pull: 拉去并合并分支
fetch: 拉去但不合并
最好是已经克隆了远程库, 否则会报错, 要使中括号中的内容
中括号中是在远程库和本地库不一致的时候使用的命令.
克隆
git clone url
