git learning &4 分支管理

1.常见命令

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

2.本地分支push到 不同名的远程分支(eg:本地a分支的内容需要同步到远程master分支)

查看分支的对应情况
①本地(创建)切换同名分支,然后将别的分支合并到该同名分支,然后push到远程端
git checkout master
git merge a
git push  # will push 'master'

②git push origin a:master

③git push --all origin

3.保留当前分支工作区,切换到其他分支

git stash    #保存当前分支的工作现场
切换分支回来之后
git stash pop #恢复工作现场

ref:Git push won’t do anything (Everything up-to-date)

git learning &3远程仓库

1.添加密钥

ref:https://www.cnblogs.com/xixihuang/p/5522424.html

①ssh-keygen -t rsa -C “enlei.gong@cienet.com.cn”

(密钥类型用-t指定,默认ssh-2,这里指定rsa;-c指定注释)

②复制公钥id_rsa.pud到剪贴板:clip <~/.ssh/id_rsa.pub

或者cat  ~/.ssh/id_rsa.pub 然后手动复制

③将ssh key添加到github

ref:https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/

④测试ssh是否成功地添加到github:ssh -T git@github.com

2.添加远程库

关联远程库:

$git remote add origin git@github.com:gongel/learngit.git

推送到远程库

$git push origin master (origin主机名,master远程端分支名)

git push常见用法

git 三区域和状态

1.HEAD、Index、Working Directory

Git里有三个区域很重要

  1. HEAD 指向最近一次commit里的所有snapshot
  2. Index 缓存区域,只有Index区域里的东西才可以被commit
  3. Working Directory 用户操作区域

2.各种状态

初始状态

当你checkout分支的时候,git做了这么三件事情

  1. 将HEAD指向那个分支的最后一次commit
  2. 将HEAD指向的commit里所有文件的snapshot替换掉Index区域里原来的内容
  3. 将Index区域里的内容填充到Working Directory里

所以你可以发现,HEAD、Index、Working Directory这个时候里的内容都是一模一样的。

注意:一般会误解为,Index中的内容是空的,只有git add后才会有东西。实际上不是,Index里一直是有东西的。

所以,Git的所有操作就是对这三个区域的状态(或内容)的操作。

Untracked files

如果在目录下新建了文件(即之前没有add过的文件,就会出现“untracked files”即没有被跟踪的文件)

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        b.txt

Changed

如果你在Working Directory里修改了文件,git会发现Working Directory里的内容和Index区域里的内容不一致了。

这个时候git status的结果是:

# Changes not staged for commit:(之前add过的文件但是又被修改了)

Staged

一个文件仅仅changed是不能被commit的,Git要求只能提交Index里的东西。

所以需要git add。这个命令的意思是,把Changed的文件的内容同步到Index区域里。这样Working Directory和Index区域的内容就一致了。这个过程被称之为stage

这个时候git status的结果是:

# Changes to be committed:(已经add过的就等commit了)

Committed

最后,你就可以提交了

git commit

这样,就把HEAD的状态和Index以及Working Directory形成一致了。

ref:https://segmentfault.com/a/1190000006185954

git learning &2 undo

1.local changes

$git status
查询哪些文件deleted,modified,Untracked(没有add)
$git diff
查看具体修改的内容
git learning #*
git中的各种状态

2.commit history

$git log
show all commits,starting with newest(从远到近显示commits)

$git reflog
git reflog查看命令历史,可以重返未来(因为一旦回到过去,未来的某个commit id也许不见了)

3.版本回退

$git reset --hard HEAD
用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

$git reset --hard "commit id"
利用git log可以查看某个commit id,版本号没必要写全,前几位就可以了,Git会自动去找(但保证唯一)

4.撤销修改

$git checkout --file_name
丢弃工作区的修改(包括add和commit后也可以成功恢复,其实就是版本库里的文件直接覆盖工作区的文件)

5.删除文件(commit后)

先git rm,并且git commit -m "remove file"

git learning &1 初始化操作

1.创建属于自己的标识

git config --global user.name "your name"(一般可以 为你在公司的ID)
git config --global user.email "your email"(一般可以 为你在公司的邮箱)

2.创建版本库

①clone an existing repository
$git clone ssh://user@domain.com/repo.git
git clone支持的协议主要有http://,ssh://,git://,当然也可以是本地的file://

②create a new local repository
$git init (at current directory,check it by using $pwd)

3.添加并提交文件到版本库

$git add file   #把文件添加到版本库,可以多次反复使用,添加多个文件。实际上就是把文件修改添加到暂存区Stage

$git commit -m "some instructions" #把文件提交到版本库,可以一次提交多个文件。实际上就是把暂存区的所有内容提交到当前分支
工作区 暂存区