本地操作
add和commit
add
git add a.txt b.txt
git add -A
/ git add .
commit
git commit -m "message"
撤销add和commit
针对提交区:
git commit --amend
进行提交、并用该提交代替上次提交。
例如当上次提交忘记提交一些文件:git add a.txt
并 git commit --amend
。
git rebase -i X
删除X到head的提交,合并成一个新提交代替。
针对暂存区的文件:
git restore --staged a.txt
, git reset head a.txt
用提交去覆盖暂存区。如果创建或者修改了某个文件,不想这一次提交,但是git add了,可以用这个命令撤销add。
git rm --cached a.txt
删除暂存区对此文件的跟踪。如果创建了新文件,不想跟踪,但是使用了git add,可以用这个命令来撤销add。如果不想跟踪某文件了,用这个命令取消跟踪。
针对本地文件:
git restore a.txt
用暂存区覆盖本地。小心使用,本地文件都会被覆盖。
注意:
1、提交的东西基本都可以恢复。例如amend覆盖的,删除的分支包含的。
2、用上次提交覆盖本地文件:git restore --staged a.txt
+ git restore a.txt
远程仓库
可以有多个远程仓库,远程仓库可能是只读或者可读写的。
查看:
git remote
查看远程仓库,如果是git clone获得的项目,会有origin
git remote -v
查看远程仓库,附带url信息,以及读写权限信息
git remote show <remote>
查看详细信息: 对比分支,列出pull信息
git ls-remote <remote>
查看这个仓库里有哪些分支和标签
git remote add <remote_name> url.git
添加仓库
git remote rename old new
重命名仓库
git remote remove
删除仓库
git clone
命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支。
1、获取仓库所有分支和tag,增加前缀"origin/",这些分支不能通过本地提交使之移动,只会根据远程仓库里的分支移动而移动,因此,如果git clone后切换到origin/master分支,并commit,origin/master不会移动。
2、在origin/master节点创建master分支,并且切换到这个分支。
git fetch <remote>
下载这个仓库中本地没有的提交,下载和更新所有origin/XXX分支。
一般首次获取远程仓库用git clone,后续本地可能也有提交了,用git fetch获取远程仓库的更新。
一般会先获取远程仓库:
git remote add <remote> XX.git
git fetch <remote>
然后在本地创建分支:
git checkout origin/dev
git branch dev
git checkout dev
# 等价于
git checkout -b dev origin/dev
# 等价于
git checkout dev # 同名
git pull
通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
当前分支跟踪了<remote>/<branch>
分支,则git pull
相当于 git fetch <remote>
+git merge <branch>
。
何时会跟踪:
1、例如远程仓库 A<- B 本地clone后,远程仓库更新为 A<- B<- C,本地master为A<-B master分支执行git pull就会更新为A<- B<- C
2、或者本地fetch后执行git checkout -b dev origin/dev
也会创建dev分支跟踪远程分支,此时也可以用git pull获取最新提交。
3、也可以手动创建跟踪
git push origin --delete dev
删除远程仓库上的某个分支
git push origin dev
或者 git push origin mydev:remotedev
把dev分支推送到此仓库。
git push
把当前分支push到跟踪的远程分支上。如果没有跟踪的话,需要设置或者指定分支。
push的结果:
1、如果这个仓库没有dev分支,会创建,
2、如果有dev分支,且上次fetch/clone后没人push过,即远程仓库的最新提交是本地dev分支的祖先,则在这个分支后面添加commit。
3、否则,push失败。解决:fetch,然后merge,再push。
总结:
push和pull针对分支,clone和fetch针对仓库;
pull和fetch用于拉取,push用于提交;
pull可以用fetch+merge替代,因此只需要理解两个指令,fetch和push即可。
常见使用流程
本地git项目上传到远程仓库
- 创建或进入项目
git init
- 在远程仓库创建项目,比如在码云创建一个仓库test。
- 添加仓库
git remote add origin https://gitee.com/xx/test.git
- 把本地代码push到这个仓库
git push -u origin "master"
下载已有的代码,合作开发。
git clone www.XX.git
下载- 已经完成,现在可以把本地代码push到这个仓库了
git push -u origin "master"
标签
git tag
查看所有
git tag -l "v1.1.*"
搜索
git show v1.1
查看某条标签
给上一次提交打标签:
轻量标签:仅仅一次提交的引用. git tag v1.4-lw
附注标签:附带了打标签者的名字、电子邮件地址、日期时间。git tag -a v1.4 -m "my version 1.4"
给某一次提交打标签:
git tag -a v1.2 9fceb02
git tag -d
删除标签
git checkout -b newbranch v1.5
在某个分标签创建分支
上传标签:
git push origin v1.5
创建远程标签
git push origin --delete v1.5
删除远程标签
别名
git config --global alias.A 'B'
使得A成为B指令串的别名
分支
查看
git branch
git branch -v
git branch --merged
git branch --no-merged
git show-branch
详细列出所有分支
git show-branch bug/*
详细列出某类分支
git merge-base original-branch new-branch
指定起点和终点,查找分支点
创建
git branch newBranch [start-branch]
(从指定节点(默认当前节点))启动新的分支。
切换到分支(需要先commit或者stash)
git checkout dev
可选参数
-m
如果本地文件和上次commit不同:尝试合并本地和目标分支。
-f
强制切换分支,丢失本地文件。
创建并切换:
git checkout -b dev
删除,要理解分支是指向头的指针,而不是节点集合。
git branch -d branchName
只能删除merge后的分支。
git branch -D branchName
强制删除。
merge
只能合并两个(或多个)在同一仓库里的分支。分支可以引用的其他仓库。
merge结果:
在master分支,执行 git merge dev
结果如下
- 如果master是dev的祖先。执行结果:master向前移动,指向dev。
例如master本来指向c,dev指向d,则执行结束后master指向d。 - 如果dev是master的祖先,结果:操作失败,提示Already up to date. 因为新分支没必要往回走。
- 否则,考虑master,dev,以及它们的共同祖先。结果:生成一个新提交,并让master指向它。
例如master本来指向D,dev指向G,它们共同祖先是B,则结果是:首先,生成一个新提交H,H有两个父亲,其次,master指向H。
总结:
- 对于情况1、3,执行完merge后,dev也就失去了意义,可以删掉。
- 当我们想在master分支上做修改时,会新建分支dev,dev提交几次后,需要merge到master里面,即切换到master分支,执行
git merge dev
,此时就会出现情况1或者情况3。 - 在情况3中,merge后,dev分支发起的新提交接在dev后面,即G后面.
- 交换master和dev的位置,生成的H节点是一样的,区别是dev而不是master会向前移动。因此想移动谁,保留谁,就在哪个分支上merge另一个分支。
合并冲突:
当两个分支,对比分歧点(C),都修改了同一文件的同一行,就会产生冲突。每一个冲突都需要手动解决:本地打开有冲突的文件,修改完后 git add a.txt
,git commit
。修改commit信息。
如果没有冲突,则merge后,直接修改commit信息。
监控状态
log,
diff,
show : show-branch
status: