git-总结

安装git

查看git是否安装

git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
安装git
sudo apt-get install git

创建版本库

mkdir learngit
cd learngit
git init

添加文件到git仓库,分两步

第一步:git add <file>
第二步:git commit -m "description information"

git add --all
git add 命令的all参数,表示保存所有变化(包括新建、修改和删除)。从git 2.0开始,all是git add的默认参数,所以也可以用git add . 代替

查看当前git仓库状态

git status
查看修改后的文件跟原先有什么不同
git diff <file>

显示从最近到最远的提交日志
git log
git log --pretty=oneline

版本回退

git reset --hard HEAD^

版本回退到某个版本
git reset --hard 3628164

git是跟踪修改的,每次修改如果不add到暂存区,就不会加入到commit中

撤销修改

git checkout -- file
命令git checkout -- readme.txt 的意思是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况
一种是readme.txt自修改后还没被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区,后又作了修改,现在,撤销修改就回到了添加到暂存区后的状态;
总之,就是让这个文件回到最近一次git commit 或git add的状态。

删除文件

git rm test.txt
git commit -m "remove test.txt"

远程仓库

  1. 创建ssh key   

   ssh-keygen -t rsa -C "1126785053@qq.com"

  1. 登录Github,打开Account settings

   Add SSH Key

添加远程仓库

git remote add origin git@github.com:liruizhong/learngit.git
git push -u origin master
git push origin master

克隆一个远程仓库到本地

git clone git@github.com:liruizhong/gitskill.git

分支管理

  • 创建与合并分支
  • 创建一个dev分支,然后切换到dev分支
git checkout -b dev

  等同于

git branch dev
git checkout dev

查看当前分支

git branch
*dev
 master
当前分支前会标一个*号

合并指定分支到当前分支

git merge dev

删除分支,此处以删除dev为例

git branch -d dev

小结

  • 查看分支:git branch
  • 创建分支:git branch
  • 切换分支:git checkout
  • 创建+切换分支:git checkout -b
  • 合并某分支到当前分支:git merge
  • 删除分支:git branch -d

解决冲突

git log --graph --pretty=oneline --abbrev-commit 可以查看到分支合并图

分支管理策略

  在实际开发中,我们应该按照介个基本原则进行分支管理
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

小结

  • Git分支十分强大,在团队开发中应该充分应用
  • 合并分支时,加--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

DUG分支

  1. 去修复bug前,将当前工作去储存 git stash
  2. 然后切换到要修复bug的分支git checkout master
  3. 创建临时分区修复bug :git checkout -b issue-101
  4. 修复完成提交:git add readme.txt git commit -m "fix bug issue-101"
  5. 切换回主分支:git checkout master
  6. 将issue-101分支合并到主分支:git merge --no-ff -m "merged bug fix 101" issue-101
  7. 删除临时分支issue-101:git branch -d issue-101
  8. 然后切换回原工作区:git checkout dev
  9. 查看自己当时的储存工作现场:git stash list

恢复工作现场:

  • 一种方法: git stash apply stash@{0} git stash drop
  • 另一种方法:git stash pop

Feature分支

小结:

  • 开发一个新的feature,最好新建一个分支
  • 如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除

多人协作

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

  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 branch-name origin/branch-name
这就是多人协作的工作模式,一旦熟悉,就非常简单。

小结:

  • 查看远程库信息,使用:git remote -v
  • 本地新建的分支如果不推送到远程,对其他人就是不可见的
  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致
  • 建立本地分支和远程分支的关联,使用git branch --set-upsream branch-name origin/branch-name
  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

标签管理

创建标签

小结

  • 命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
  • git tag -a -m "blablabla..." 可以指定标签信息;
  • git tag -s -m "blablabla..." 可以用PGP签名标签;
  • 命令git tag 可以查看所有标签;

操作标签

小结

  • 命令git push origin 可以推送一个本地标签;
  • 命令git push origin --tags 可以推送全部未推送过的本地标签;
  • 命令git tag -d 可以删除一个本地标签;
  • 命令git push origin :refs/tags/可以删除一个远程标签

使用GitHub

小结

  • 在GitHub上,可以任意Fork开源仓库;
  • 自己拥有Fork后的仓库的读写权限;
  • 可以推送pull request给官方仓库来贡献代码。

忽略特殊文件

小结

  • 忽略某些文件时,需要编写.gitignore;
  • .gitignore文件本身要放到版本库里,并且可以对.gitinore做版本管理!

配置别名

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

配置文件

$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = git@github.com:michaelliao/learngit.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[alias]
    last = log -1


$ cat .gitconfig
[alias]
    co = checkout
    ci = commit
    br = branch
    st = status
[user]
    name = Your Name
    email = your@email.com
posted @ 2016-01-26 09:43  幻月0412  阅读(187)  评论(0编辑  收藏  举报