git clone
默认是克隆Head
指向的master
分支,如果是多分支,我们可以单个克隆分支项目。1.只克隆单分支(非master):
git clone -b 分支名 https://xxx.git
2.克隆所有分支(多分支)
cd project //切换到指定目录 git clone https://xxx.git //克隆项目(默认master分支)
git branch -a //列出远程跟踪及本地分支
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
$ git init
$ git add readme.txt
$ git commit -m "wrote a readme file"
$ git status
$ git log
$ git reflog
$ git reset --hard commit_id
expmple:
git reset --hard HEAD^
git reset --hard 1094a
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,或者删除了工作区某个文件,用命令
$ git checkout -- <file>
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步
$ git reset HEAD <file>
$ git checkout -- <file>
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本间穿梭一节,不过前提是没有推送到远程库。
$ git rm <file>
$ git commit -m "remove test.txt"
创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
登陆GitHub,打开“Account settings”,“SSH Keys”页面。然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容
登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库
根据GitHub的提示,在本地的learngit
仓库下运行命令(请千万注意,把上面的michaelliao
替换成你自己的GitHub账户名):
$ git remote add origin [email protected]:michaelliao/learngit.git
就可以把本地库的所有内容推送到远程库上(添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库):
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令:
$ git push origin master
如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm <name>
命令。使用前,建议先用git remote -v
查看远程库信息:
$ git remote -v
origin [email protected]:michaelliao/learn-git.git (fetch)
origin [email protected]:michaelliao/learn-git.git (push)
然后,根据名字删除,比如删除origin
:
$ git remote rm origin
此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。
git branch
git branch <name>
git checkout <name>
or
git switch <name>
git checkout -b <name>
or
git switch -c <name>
git merge <name>
git branch -d <name>
可以通过git branch -D <name>
强行删除
git log --graph --pretty=oneline --abbrev-commit
git remote -v
本地新建的分支如果不推送到远程,对其他人就是不可见的;
git push origin branch-name
如果推送失败,先用git pull
抓取远程的新提交
git checkout -b branch-name origin/branch-name
本地和远程分支的名称最好一致
git branch --set-upstream-to <branch-name> origin/<branch-name>
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
$ git tag <tagname>
默认标签是打在最新提交的commit上的,也可以指定一个commit id
$ git tag v0.9 f52c633
用-a
指定标签名,-m
指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
$ git tag
v1.0
标签不是按时间顺序列出,而是按字母排序的。git show <tagname>
$ git show v0.9
commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
Author: Michael Liao <[email protected]>
Date: Fri May 18 21:56:54 2018 +0800
add merge
diff --git a/readme.txt b/readme.txt
...
$ git tag -d <tagname>
$ git push origin <tagname>
一次性推送全部尚未推送到远程的本地标签
$ git push origin --tags
$ git tag -d <tagname> //删除一个本地标签
$ git push origin :refs/tags/<tagname> //删除一个远程标签
$ git config --global -l
$ git config --global http.proxy 127.0.0.1:7890
$ git config --global --unset http.proxy
当我们在某一条分支上开发新功能时,突然有个紧急的错误需要修复
这时,我们不得不暂停手头上的工作,切换到另外的分支去修复错误
但是,新功能做到一半,既不能提交,也不能删除,那该怎么办呢
我们可以先把当前的更改保存起来,等处理完错误后再恢复出来,git stash 就是这样的一个用法
它可以将工作区和缓存区的更改保存到一个栈结构中,等后面需要的时候再恢复
> # 将当前工作区和暂存区的更改保存到一个栈结构
$ git stash
> # 将当前工作区和暂存区的更改保存到一个栈结构,并附带一个信息
$ git stash save "message"
$ # 将当前工作区和暂存区的更改保存到一个栈结构,包括新增的文件
$ git stash -u
$ git stash --include-untracked
> # 将当前工作区和暂存区的更改保存到一个栈结构,包括新增的文件以及忽略的文件
$ git stash -a
$ git stash --all
> # 查看栈中保存的更改
$ git stash list
> # 查看栈中第一个更改的具体内容
$ git stash show
> # 查看栈中指定的更改的具体内容
$ git stash show <stash id>
> # 将栈中的第一个更改恢复到当前工作区和暂存区
$ git stash apply
> # 将栈中的指定的更改恢复到当前工作区和暂存区
$ git stash apply <stash id>
> # 删除栈中的第一个更改
$ git stash drop
> # 删除栈中的指定的更改
$ git stash drop <stash id>
> # 将栈中的第一个更改恢复到当前工作区和暂存区,同时删除栈中的第一个更改
$ git stash pop
> # 将栈中的指定的更改恢复到当前工作区和暂存区,同时删除栈中的指定的更改
$ git stash pop <stash id>
> # 清空栈中保存的更改
$ git stash clear