关于使用git

git本地

下载并安装git

创建git版本库

  1. 新建空目录
  2. 初始化仓库:git init
  3. 添加到仓库 :git add filename
  4. 将文件提交到仓库: git commit -m “wrote a file”

    commi可以一次提交很多文件,所以你可以多次add不同的文件
    

本地文件修改后提交

  1. 修改文件后查看状态:git status
  2. 查看两个文件的改变:git diff

    要随时掌握工作区的状态,使用git status命令。
    

    如git status告诉你有文件被修改过,用git diff 可以查看修改内容。

版本回退

1.查看提交的历史版本:git log

​ 以一行的方式看(不看详情):git log –pretty=oneline

​ HEAD表示当前版本

​ HEAD^表示上一个版本

​ HEAD^^上上个版本

​ HEAD~100往前一百个版本

2.回退到上一个版本:git reset –hard HEAD^

​ 后悔了,回退到最新的一个版本:git reset –hard 版本号(要自己保存的)

3.如果自己不造:Git提供了一个命令用来记录你的每一次命令:git reflog

​ 让HEAD指向哪个版本号,你就把当前版本定位在哪

工作区和暂存区

  1. 当建立文件后,没添加到暂存区就是untracked

  2. 修改后的文件是Changes not staged for commit

  3. 添加到暂存区后没有交托给分支Changes to be committed

管理修改

查看工作区和版本库里面最新版本的区别:git diff HEAD – filename

每次修改,如果不用git add到暂存区,那就不会加入到commit中。

撤销修改

  1. 丢弃工作区的修改:git checkout -- readme.txt

  2. 命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

    ​ 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

    ​ 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

    ​ 总之,就是让这个文件回到最近一次git commitgit add时的状态。

  3. 可以把暂存区的修改撤销掉(unstage),重新放回工作区:git reset HEAD <file>

  4. 除了提交到远程版本库的内容都可以修改

    ​ 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

    ​ 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

    ​ 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

删除文件

  1. 删除工作区的文件:rm filename
  2. 删除版本库中的该文件:git rm filename 并确认:git commit -m “reason”
  3. 从版本库里面恢复:git checkout –filename

远程仓库

  1. 如果本地主目录没有.ssh目录,创建获得ssh公钥和密钥: ssh-keygen -t rsa -C “youremail@example.com
  2. 在github里添加自己的ssh公钥

添加远程库

  1. Create a new repo

  2. 远程库关联:git remote add origin git@github.com:karen2066/learngit.git

  3. 把本地库的所有内容推送到远程库上:git push -u origin master

    ​ 实际上是把当前分支master推送到远程

  4. 把本地master分支的最新修改推送至GitHub: git push origin 分支名

从远程库克隆

  1. 新建GitHub仓库
  2. 克隆一个本地库: git clone git@github.com:karen2066/gitskills.git
  3. git还听个http协议的地址,但这种方式需要输入口令

分支管理

新建分支:git checkout -b dev

​ 这条命令等于: git branch dev + git checkout dev 两条命令

查看当前分支: git branch

​ 当前分支前面会标一个*号

切换分支:git checkout master

合并分支的工作:git merge dev(dev是分支名称)

git merge命令用于合并指定分支到当前分支

删除分支:git branch -d dev

当分支提交冲突时:

​ master上修改,再提交,解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交(再往前提交一个版本相当于就是合并)

查看分支合并的情况:git log

查看分支合并图:git log –graph

分支管理策略

Git的分支管理模式:Fast forward,

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

禁止使用快速合并模式:git merge –no-ff -m “merge with no-ff” dev

master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活

加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并

bug分支

把当前工作现场“储藏”起来,等以后恢复现场后继续工作:git stash

查看刚才保存的工作现场:git stash list

恢复现场,但不删除stash内容:git stash apply

恢复现场,同时删除stash内容:git stash pop

可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash: git stash apply stash@{0}

Feature分支

每添加一个新功能新建一个feature分支

丢弃一个没有被合并过的分支,强制删除分支: git branch -d feature-vulcan

多人协作

查看远程库的信息:git remote

查看远程库详情:git remote -v

推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库: git push origin master、git push origin dev……

原则:

  • master分支是主分支,因此要时刻与远程同步;

  • dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

  • bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

  • feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

    抓取分支

    创建远程origindev分支到本地:git checkout -b dev origin/dev

    ​ 另一种:在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

    当提交到远程库有冲突时,先Git pull 把最新的origin/dev抓取下来, 本地合并解决冲突再推送

    设置devorigin/dev的链接:git branch –set-upstream-to=origin/ dev

    再Git pull拉取

多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

Rebase

把分叉的提交变成直线

git rebase

  • rebase操作可以把本地未push的分叉提交历史整理成直线;

  • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

    ####标签管理

    标签是版本库的一个快照,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

    #####创建标签

    切换到需要打标签的分支上:git branch/git checkout master

    打标签:git tag

    查看所有标签:git tag

    对以前的版本打标签:git tag v0.9 f52c633(commit id)

    查看commit id:git log –pretty=oneline –abbrev-commit

    ​ 注意,标签不是按时间顺序列出,而是按字母排序的

    查看标签信息:git show v0.9(tag名)

    创建带有说明的标签,用-a指定标签名,-m指定说明文字:git tag -a v0.1 -m “version 0.1 released” 1094adb

注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

##### 操作标签

删除:git tag -d v0.1

推送某个标签到远程:git push origin

一次性推送全部尚未推送到远程的本地标签:git push origin –tags

如果标签已经推送到远程,要删除远程标签:

​ 先从本地删除:git tag -d v0.9

​ 从远程删除:git push origin :refs/tags/v0.9

忽略某些文件

创建.gitignore文件,把要忽略的文件名填进去

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore忽略了:如果你确实想添加该文件,可以用-f强制添加到Git:git add -f App.class

哪个规则写错了可以用git check-ignore命令检查:git check-ignore -v App.class

​ Git会告诉我们,.gitignore的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。

####配置别名

给status配置别名: git config –global alias.st status

配置文件

每个仓库的Git配置文件都放在.git/config文件中:cat .git/config

​ 别名就在[alias]后面,要删除别名,直接把对应的行删掉即可

当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:cat .gitconfig

开源Git:

点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:(一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址`git@github.com:twbs/bootstrap.git`克隆,因为没有权限,你将不能推送修改。)

可以在GitHub上发起一个pull request