GIt总汇

260 阅读7分钟
1.git安装和配置

git config -- global user.name "your name"

git config -- global user.email "your email"

2.创建仓储

mkdir name   创建文件夹
pwd          显示当前目录

git init / git init -y    初始化管理仓储(多了.git文件夹)

3.基本命令

git add filename / .(全部)  提交到在暂存区
git commit -m  "版本说明"     提交到本地版本仓库

4.版本控制

git log /git log --pretty=oneline     查看历史版本(单行简洁形式)
git reflog                            查看历史命令

git reset --hard HEAD^                回退到上个版本
git reset --hard HEAD~100             回退到往上100个版本          
git reset --hard version(前几位即可) 回退到指定版本(version指提交到库存时自动生成的那一串)

5.工作区域和暂存区

cat filename               读取文件的内容

git status                 查看当前状态,随时掌控版本状态
git diff HEAD -- filename  查看指定文件当前与仓储中最新版本的区别

6.管理修改

1.代码修改后还没加入暂存区
git checkout -- filename    撤销后代码和版本库最新版一样

2.代码修改后加入暂存区但未提交,又做了修改现在只想将后来的修改废弃
git  checkout -- filename    撤销后代码和刚提交暂存区时一样

3.代码修改后加入暂存区但未提交,现在想废弃这段改动(废弃暂存区该代码 ——>废弃工作区该代码)
git  reset  HEAD  filename   撤销暂存区该文件的改动
git  checkout -- filename    撤销后代码和版本库最新版一样

4.修改了代码并提交了本地仓储
git reset --hard HEAD^       回退版本

注意:检验完毕后再推送代码到远程仓储

7. 删除文件

rm  <file>  删除文件

情景:删除了文件file,工作区和仓储文件不再一致

1. 直接删除仓储中该文件并提交
git  rm  <file>               删除仓储中文件file
git  commit -m '删除了file'   提交仓库

2. 误删除了文件file直接从仓库回复即可
git checkout -- file

注意:从来没有被提交到版本库中就被删除的文件是无法恢复的

8.1 创建和合并分支

git branch   dev       创建dev分支
git checkout dev       切换到dev分支
git checkout -b dev    创建并切换dev分支

git branch             查看当前所在的分支 *代表当前分支
git branch -a          查看远程分支列表
git merge dev          合并指定分支到当前分支
git branch -d <name>   删除指定分支 
git branch -D <branch> 强制删除分支

8.2 分支合并冲突

分支1和分支2存在冲突时无法正常合并,git会用<<<<<< , ======,>>>>>>标记冲突所在(master|merging)
解决:
a.手动删除(2中修改保留一种即可)
b.git add ->git commit 就会自动合并

git log --graph --pretty=oneline (查看合并情况)
git log --graph --pretty=oneline --abbrev-commit(查看合并情况【版本id缩略显示】)

8.3 分支管理策略

Faste forward模式合并分支: 
如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧
这就意味着这种模式下合并分支是没有历史的,看不出曾经做过合并

git merge --no-ff -m  '合并说明' <branch>      使用普通方式(禁用fast forward模式)合并 

8.4 stash的使用和bug分支

stash:手头工作没有完成时可以用stash现将工作现场保存一下,然后干别的

    git stash list                 查看场景暂存版本
    git stash pop                  恢复工作现场并删除stash中的内容
    git stash apply  [stash@{0}]   只恢复不删除stash中的内容【指定版本】
    git stash drop                 删除stash中内容

stash可以存储多个工作场景然后指定版本恢复就可以,实际工作中现存现恢复删除即可,没必要存储多个版本
   
情景:开发中突然接到紧急改BUG的任务,但是手头的工作还没有提交而且只进行一部分没法提交,该怎么解决?
解决:
a. 将工作场景用stash暂存
    git stash   暂存工作场景

b. 确保工作区干净的然后切换到理想分支(假如是master分支)创建分支修复bug
    git checkout master
    git checkout -b  issue-101
c. 修复bug后提交修改,然后切换到理想分支合并;(假如issue101用不到就可以删除了)
    git add  -> git commit -m 'fix bug 101'
    git checkout master
    git merge --no-ff -m 'merged bug fix 101' issue-101
    
    删除分支issue-101
    git branch -d issue-101
d. 回到dev分支,恢复工作场景暂存后继续干活

    git checkout dev
    恢复工作场景暂存后继续干活
    git stash pop                  恢复同时删除stash中的内容

8.5 Feature分支

在开发一个新功能时最好新建一个feature分支在上面开发,完成后合并最后删除分支即可
a. 可以防止把主分支搞乱
b. 假如某个功能临时决定就取消了,在合并到主分支之前直接强制删除该分支即可

9.链接远程仓储

git remote -v             查看远程详细信息,假如没有推送权限就看不到push地址
git pull [origin dev]     从远程拉取代码并合并
git push origin <branch>  将branch分支代码推送到远程master分支

GitHub篇

1.用git生成SSH密钥

ssh-keygen -t rsa -C "yourEmail"
成功后会在用户根目录(C:\Users\用户\.ssh)生成.ssh目录包含id_rsa(私钥)和id_rsa.pub(公钥)两个文件

2.将id_rsa.pub中的内容全部复制粘贴到github->setting->SSH keyes-->add key-->key中(title随意)

3.关联本地仓储(master分支)
$git remote add origin git@github.com:XXX/XXX.git(推荐ssh协议地址)
$git remote rm origin (删除关联github项目地址,然后再关联即可修改项目地址)

4.向远程推送

git push -u origin master   首次推送  
(Git将本地的master分支内容推送的远程新的master分支,并将本地的master分支和远程的master分支关联起来令)
git push origin master       以后推送

5.从远程克隆代码(在想要创建项目的目录处git bash)
$get clone  git@github.com:zccxy/Repository.git (推荐ssh协议)

9.1 多人协作

多人协作
1. 从远程拉取代码并合并           git pull
2. 如果有冲突解决冲突并在本地提交
3. 没有冲突或者解决冲突后 git push origin <master/dev>

哪些分支需要推送到远程库?
master 分支  : 主分支时刻保持和远程同步
dev    分支  : 开发分支,和远程代码同步保证共享
bug    分支  : 用于本地bug修复,一般不推送
feature分支  : 看具体情况


在git clone时git已经将本地的master分支和远程的master分支对应起来了远程仓储默认origin

dev分支更新远程dev分支代码

1.查看本地是否有dev分支/远程是否有dev分支 
    + git branch
    + git branch -a 
2-1.如果远程有dev分支,且本地有没有dev分支
    + git fetch origin dev (此时自动关联本地和远程的dev分支,后续只要执行步骤5即可)            
2-2.如果远程有dev分支,本地创建了dev分支;
    + git checkout -b  dev origin/dev  
   
3.拉取远程代码(远程有dev分支)/直接推送到远程(远程没有dev分支)
    + git pull origin dev
    + git push origin dev
4.关联本地dev分支和远程dev分支
    + git branch --set-upstream-to=origin/dev dev

    + git push --set-upstream origin dev  首次关联+推送
5.后续推送代码到远程dev分支
    + git pull
    + git push origin dev