Git学习笔记

Git 三个区域、四种状态

  • 工做区(Working Directory)就是你在电脑里能看到的目录
  • 版本库(Repository)工做区有一个隐藏目录.git,这个不算工做区,而是Git的版本库。

Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEADhtml

在这里插入图片描述

在这里插入图片描述

Git相关命令操做

设置Git参数git

# 显示当前的 Git 配置
git config --list

# 设置提交仓库时的用户名信息
git config --global user.name "fuziwang"

# 设置提交仓库时的邮箱信息
git config --global user.email "2622860598@qq.com"

三个区域、四种状态相关操做github

# 在当前目录新建一个 Git 代码库
git init

# 添加指定文件到暂存区
git add [file1] [file2]

# 提交暂存区到仓库
git commit –m [message]

# 直接从工做区提交到仓库,前提该文件已经有仓库中的历史版本
git commit –a –m [message]

# 显示变动信息,能够展现四种状态的相关信息
git status

# 显示当前分支的历史版本
git log
git log --pretty=oneline "在一行显示"

# 记录你的每一次提交版本和回退版本的信息
git reflog

# 查看readme.txt文件在工做区和版本库里面最新版本的区别
git diff HEAD -- readme.txt

# 当对工做区进行修改以后,(无论上一次是否git add)尚未git add,丢弃对工做区的修改
git checkout -- [file]

# 当已经添加到暂存区,尚未git commit,能够把暂存区的修改撤销掉(unstage),从新放回工做区
git reset HEAD [file]

# 版本回退,一旦把文件改乱了,或者误删了文件,还能够从最近的一个commit恢复
git reset --hard HEAD^
git reset --hard "commit-id"

# 删除工做区文件,而且将此次删除放入暂存区,以后只须要git commmit,不须要git add
git rm [file1] [file2]

# 更名文件,而且将这个更名放入暂存区,以后只须要git commmit,不须要git add
git mv [file-origin] [file-renamed]

Git分支管理

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。在Git里,有一个主分支,即master分支。HEAD严格来讲不是指向提交,而是指向mastermaster才是指向提交的,因此,HEAD指向的就是当前分支。面试

每次提交,master分支都会向前移动一步,这样,随着版本的不断提交,master分支的线也愈来愈长:安全

master-line

Fast-forward 快速合并

fast-forword

# 建立dev分支,而后切换到dev分支
# git checkout命令加上-b参数表示建立并切换 至关于 git branch dev & git chekout dev
git checkout -b dev

# 查看当前分支是什么
git branch

# 把dev分支的工做成果合并到master分支上 git merge命令用于合并指定分支到当前分支
git merge dev

# 合并完成后,删除dev分支
git branch -d dev

# 若是要放弃分支的全部操做,不进行合并,强制删除分支的全部操做
git branch -D feature-vulcan

解决冲突

solve-problem

上述图片过程当中会出现冲突,还原冲突过程:bash

  • 准备新的feature1分支,对readme.md文件进行修改,而且在新的分支上进行了一次提交。
  • 切换到master分支,一样对readme.me文件进行修改,而且在主分支上进行了一次提交。
  • 此时进行合并,git merge feature 运行这个命令会产生冲突,此时须要解决冲突,须要手动修改文件内容。
  • Git用<<<<<<<,=======,>>>>>>>标记出不一样分支的内容,对文件进行修改后,再进行一次提交

用带参数的git log也能够看到分支的合并状况app

~/learngit(master) » git log --graph --pretty=oneline --abbrev-commit
*   a0c8a45 conflict fixed
|\  
| * a8b263e AND simple
* | 5565d9c & simple
|/  
* faa2e24 branch test
...

--no-ff 方式的 git merge

  • 建立并切换dev分支,修改readme.txt文件,并提交一个新的commit
  • 切换回master,准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward

合并后,咱们用git log看看分支历史:ssh

~/learngit(master) » git log --graph --pretty=oneline --abbrev-commit
*   fc2593c merge with no-ff
|\  
| * ecca429 add merge
|/  
*   2a45671 conflict fixed
...

Git stash

若是如今接到一个修复bug的任务时,须要建立一个分支bug-1来修复它,可是,当前正在dev上进行的工做尚未提交,工做只进行到一半,还无法提交。此时须要去修复bug,当前工做区须要暂时保存下来,等bug修复彻底再继续工做。fetch

Git提供了一个stash功能,能够把当前工做现场“储藏”起来,等之后恢复现场后继续工做:网站

~/learngit(dev*) » git stash
Saved working directory and index state WIP on dev: ecca429 add merge
HEAD 如今位于 ecca429 add merge

此时能够进行bug的修复。修复完成后,回到dev开发工做中,用git stash list命令看看当前保存的环境状态。

~/learngit(dev) » git stash list
stash@{0}: WIP on dev: ecca429 add merge

工做现场还在,Git把stash内容存在某个地方了,可是须要恢复一下,有两个办法:

  • git stash apply恢复,可是恢复后,stash内容并不删除,你须要用git stash drop来删除
  • git stash pop,恢复的同时把stash内容也删了

Rebase

对于该部分,能够看一下http://gitbook.liuhui998.com/...,我以为这个讲解的更加清楚

rebase操做能够把本地未push的分叉提交历史整理成直线rebase的目的是使得咱们在查看历史提交的变化时更容易,由于分叉的提交须要三方对比。

应用场景:当本地比远程仓库多了几个提交以后,须要git push,但当push的时候发现,远程仓库已经有人先进行了推送,所以须要先pull下来,此时输入git log --graph --pretty=oneline --abbrev-commit 会发现内容很是乱很差看,此时能够输入git rebase

~/learngit(master) » git rebase
First, rewinding head to replay your work on top of it...
Applying: add comment
Using index info to reconstruct a base tree...
M    hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py
Applying: add author
Using index info to reconstruct a base tree...
M    hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py
-----------------------------------------------------------
# 此时再输入git log命令会发现内容进行了整理
~/learngit(master) » git log --graph --pretty=oneline --abbrev-commit
* 7e61ed4 (HEAD -> master) add author
* 3611cfe add comment
* f005ed4 (origin/master) set exit=1
* d1be385 init hello
...

Git与GitHub

更多github的使用:http://developer.51cto.com/ar...

GitHub这个网站就是提供Git仓库托管服务的,本地Git仓库和GitHub仓库之间的传输是经过SSH加密的,因此,须要一点设置:

第1步:建立SSH Key。在用户主目录下,看看有没有.ssh目录,若是有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,若是已经有了,可直接跳到下一步。若是没有,打开Shell(Windows下打开Git Bash),建立SSH Key:

~ » ssh-keygen -t rsa -C "2622860598@qq.com"

在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥。

第2步:登录GitHub,打开“Account settings”“SSH Keys”页面:点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

为何GitHub须要SSH Key呢?
由于GitHub须要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,因此,GitHub只要知道了你的公钥,就能够确认只有你本身才能推送。GitHub容许添加多个Key

提交代码到远程仓库

将远程仓库代码更新到本地

面试常考:讨论git pullgit fetch 的关系:

  • git fetch 至关因而从远程获取最新到本地,不会自动merge
  • git pull:至关因而从远程获取最新版本并merge到本地 在实际使用中,git fetch更安全一些

Git命令操做

# 下载一个项目和它的整个代码历史
# url 格式: https://github.com/[userName]/reposName
git clone [url]

# 增长远程仓库,并命名
git remote add [shortname] [url]

# 将本地的提交推送到远程仓库
git push [remote] [branch]
推送分支:git push origin dev

# 将远程仓库的提交拉下到本地
git pull [remote] [branch]

# 查看远程库的信息,用git remote,或者,用git remote -v显示更详细的信息
git remote
~/learngit(master) » git remote -v
origin    https://github.com/fuziwang/learngit.git (fetch)
origin    https://github.com/fuziwang/learngit.git (push)

# 本地分支和远程分支的连接关系没有建立
git branch --set-upstream branch-name origin/branch-name
相关文章
相关标签/搜索