git是分布式版本控制系统,以前只是学习一些命令,现在学一下原理。
git协作开发时常用是,本地有拉取远程的feature分支,并随时保持与远程一致(使用git pull origin feature),本地有自己的dev分支,当本地有修改时与本地feature merge一下。要提交时先与本地feature merge(做这一步之前需要先使本地feature与远程一致即pull),之后push到远程
1、本地可以使用git init新建一个本地git仓库。
然后git add (可多次添加)将需要加入仓库的文件添加到仓库
之后git commit -m “提交说明” 将文件提交到本地仓库
2、git可以记住我们的每一次提交,也可以回到某一次我们的提交状态,使用git log即可以知道我们的每一次提交都发生了什么,然后使用git reset 命令即可回到某个提交,怎么使用呢?git中使用head表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。git reset - -hard HEAD^ 即回到上一个版本,以此类推。(相当于一个指针,但是想返回最新的版本怎么办?你需要知道它的commit id,然后使用git reset - -hard 1094a//版本号,Git还提供了一个命令git reflog用来记录你的每一次命令,这样就可以知道自己原来的commitid)
3、git status命令可以知道仓库当前的状态(哪些修改了哪些待提交之类的)
git diff 文件名 可以知道具体修改了哪些东西
4、接下来说一下git的暂存区和工作区,简单来说我们提交一些东西之前需要将文件都放到暂存区中,即git add 文件,然后commit到工作区中,使用git status就是看我们的工作区暂存区的状态。
5、当我们想丢弃某个修改的时候该怎么做呢?
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
6、删除一个文件,仓库里也需要删除,使用git rm test.txt,如果是删错了git checkout – test.txt找回仓库里的文件
7、上面说的都是本地仓库如何使用,那么我们其实主要是关联到远程仓库中的(如GitHub)
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改(如果想强制覆盖远程分支,使用–force参数)
8、从远程拷贝一个项目下来使用git clone 远程仓库地址
1.git clone 不指定分支(默认master分支)
git clone http://10.1.1.11/service/tmall-service.git
2.git clone 指定分支
git clone -b dev_jk http://10.1.1.11/service/tmall-service.git
命令中:多了一个 -b dev-jk,这个dev_jk就是分支
9、Git鼓励使用分支:(分支用来写自己部分的代码而不改变主分支,后续想要合并只需要merge一下合并到主分支并将自己的分支删除即可)
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
10、当想从一个正在执行的任务中切换到另一个分支下(比如要改bug),可以先临时保存现场,使用git stash即可,想恢复现场,使用git stash pop。
11、多人协作的工作模式通常是这样:
首先,可以试图用git push origin
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch –set-upstream-to
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
小结
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch –set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
12、打tag
在Git中打标签非常简单,首先,切换到需要打标签的分支上:
$ git branch
* dev
master
$ git checkout master
Switched to branch 'master'
然后,敲命令git tag
$ git tag v1.0
附快捷键
常用的:gcam(git commit -am)、gp、gl、gco
g - git
gst - git status
gl - git pull
gup - git pull --rebase
gp - git push
gd - git diff
gdc - git diff --cached
gdv - git diff -w "$@" | view
gc - git commit -v
gc! - git commit -v --amend
gca - git commit -v -a
gca! - git commit -v -a --amend
gcmsg - git commit -m
gco - git checkout
gcm - git checkout master
gr - git remote
grv - git remote -v
grmv - git remote rename
grrm - git remote remove
gsetr - git remote set-url
grup - git remote update
grbi - git rebase -i
grbc - git rebase --continue
grba - git rebase --abort
gb - git branch
gba - git branch -a
gcount - git shortlog -sn
gcl - git config --list
gcp - git cherry-pick
glg - git log --stat --max-count=10
glgg - git log --graph --max-count=10
glgga - git log --graph --decorate --all
glo - git log --oneline --decorate --color
glog - git log --oneline --decorate --color --graph
gss - git status -s
ga - git add
gm - git merge
grh - git reset HEAD
grhh - git reset HEAD --hard
gclean - git reset --hard && git clean -dfx
gwc - git whatchanged -p --abbrev-commit --pretty=medium
gsts - git stash show --text
gsta - git stash
gstp - git stash pop
gstd - git stash drop
ggpull - git pull origin $(current_branch)
ggpur - git pull --rebase origin $(current_branch)
ggpush - git push origin $(current_branch)
ggpnp - git pull origin $(current_branch) && git push origin $(current_branch)
glp - _git_log_prettily