赞
踩
Git2.3 目录
版本控制工具:控制代码版本,避免混乱。
自己拥有完整的版本。
git clone
下远程仓库git checkout
选择分支git add <filename>
文件放到暂存区git commit
提交修改到仓库git push repo branch
添加到远程仓库cat ./.git/config
git config user.name name
, git config user.email email
~/.gitconfig
git config --global user.name name
git config --global user.email email
进入目录后,执行初始化:
git init
或者 .git/
.git
目录.git
:跟踪管理版本库master
分支git add <filename>
git commit -m <message>
message
是提交描述git status
查看工作区的状态,常见的结果:
Changes not staged for commit
: 文件更改了,但未放入暂存区,需要add
Changes to be committed
: 文件已经放入暂存区,但未提交到版本库,需要commit
Untracked files
: 表示该文件从未被添加到版本库如果使用git commit -m <message>
,被告知文件被修改过:
git diff <filename>
,查看修改内容提交修改与提交新文件相同:
add
commit
git commit -m <message>
commit
里恢复git log
可以查看提交历史,版本库的状态,并显示从近到远的提交日志
git log --pretty=online
简化输出,每个日志单独成行
Head
表示当前的版本,而前面的则是commit id
代表着版本号
git reset --hard HEAD^
回退到上一版本
HEAD
表示回退1个版本,新版本表示不变HEAD^
表示回退2个版本,废除HEAD~n
表示回退n个版本,HEAD是个指针git reset --hard 新版本的commit id
返回过去/未来的版本
commit id
可以只写id
的前7位,git会自动寻找git reflog
查看命令历史,确定要回到的未来版本
.git
目录master
,以及指向master
的指针HEAD
git add <filename>
提交到暂存区git commit -m <message>
一次性提交所有修改git add
到暂存区,就不会加入到commit
中提交后,git diff HEAD -- <filename>
可以查看工作区和版本库最新版本的区别
此命令与git diff <filename>
相同
git diff
工作区(work dict)和暂存区(stage)的比较,上次git add
的内容git diff --cached
暂存区(stage)和仓库分支(master)的比较,上次git commit
的内容git checkout -- <file>
git checkout branch filename
git reset HEAD <file>
暂存区的修改撤销掉,重新回到工作区git checkout -- <file>
,回到未修改前git checkout branch filename
是用版本库替换工作区git checkout
获取变化的地方-
和--
的补充-
后跟短命令选项,通常是单字母,如-m
--
后跟长命令选项
git checkout -- filename
,filename
是参数而不是选项git add/rm <filename>
git commit -m <message>
提交到仓库git checkout branch file
找回本地Git仓库和Github仓库之间传输是通过SSH加密
ssh-keygen -t rsa -C "youremail@example.com"
:回车即可,无需设置密码
id_rsa
和id_rsa.pub
,这两个是SSH Key的密钥对id_rsa
是私钥id_rsa.pub
是公钥SSH and GPG keys
,点击New SSH Key
粘贴即可本地和远程仓库同步
git remote add origin url
,对远程库添加别名git push -u origin master
,本地master
和远程的master
分支关联起来git push origin master
git clone url
克隆网络库
创建新的分支后,如果要处理原来的分支,需要此。
HEAD
不是指向提交,而是指向master
,而master
是指向提交的
HEAD
指向当前分支
过程:
初始化
新增分支
切换分支,并且提交内容
合并分支
结果
git branch
git branch <name>
git checkout <name>
git checkout -b <name>
git merge <name>
git branch -d <name>
git switch
git switch -c dev
git switch master
合并时会出现代码冲突。
add + commit
合并后:
git merge <name>
git log --graph --pretty=oneline --abbrev-commit
git log --graph
合并时,默认采取Fast farword
,一旦合并,看不到合并历史,删掉分支看不到分支信息
Fast farword
,合并分支可以出现分支信息,git merge --no-ff -m "merge with no-ff" dev
--no-ff
禁用Fast farword
-m <message>
合并后,commit
的信息git log --graph --pretty=oneline --abbrev-commit
git merge --no-ff -m "merge with no-ff" dev
不使用Fast forward
模式,merge
后就像这样 :
master
应该非常稳定,只用来发布新版本dev
用来做事,意味着不稳定dev
分支合并到master
上,在master
发布版本dev
cherry-pick
修复bug,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除.
git stash
命令来把当前工作现场(dev分支)“储藏”起来,等以后恢复现场后继续工作。commit
,然后切换到master分支上合并issue-101分支git merge --no-ff -m "merged bug fix 101" issue-101
git stash list
命令看看stash
内容,然后git stash pop
,恢复的同时把stash
内容也删了继续工作。dev
分支上,要修复需要把bug分支提交的修改4c805e2 fix bug 101
复制过来,而不是整个master分支merge
过来,有git cherry-pick 4c805e2
,git会自动commit
。git cherry-pick
后,不需要在dev
分支上手动再修复一次。dev
上修复,然后在master
上重放,但是必须要git stash
,才能切换到master
分支,不然文件会丢失主要流程:
git stash
储藏工作分区git switch
切换分支git branch <name>
创建新分支git merge --no-ff -m "merged bug fix 101" issue-101
修复好buggit switch dev
切换回去git stash list
查看储藏内容git stash pop
恢复并且删除内容git cherry-pick <commit id>
打上之前的漏洞补丁git stash apply stash@{0}
恢复储藏内容,但是不删除stash内容git stash drop
删除stash内容git stash pop
恢复并删除开发一个新特性功能,最好新建一个分支。
git branch -D <name>
从远程clone仓库时,自动把本地master和远程master对应。
git remote -v
查看远程仓库信息git push origin master
推送到远程分支上
git push origin dev
推送其他分支
git clone
默认只会克隆master
分支。dev
上开发,必须创建远程的dev
分支:git checkout -b dev origin/dev
git push origin dev
同事同时推送了origin/dev
:
git pull
,在本地合并,解决冲突后,再推送dev
和远程的origin/dev
的链接:dev
和origin/dev
链接:git branch --set-upstream-to=origin/dev dev
git pull
git push origin/dev
git push origin <branch-name>
推送自己的修改git pull
试图合并git push origin <branch-name>
推送问题:A:push 文件1.txt B:push 文件1.txt(显然冲突),所以先pull,然后手工合并,假如合并过程中,A又push 文件1.txt了。等B合并完,push 文件1.txt时,又冲突掉了。感觉这情况很影响工作效率,请问git是否有对这情况有处理机制的?(SVN是有“锁”这概念的)。
答:无解,找A吵一架,所以说共同开发时,合作很重要!
git merge branchA branchB
branchB
一般默认为当前branch
,可以省略git merge origin master
:将origin
merge到master
上
git merge origin/master
:将origin
上的master
分支merge
到当前的branch
上
后push的开发者不得不先pull,本地合并,然后才能push成功。多次合并后,分支变得杂乱无章。
$ git log --graph --pretty=oneline --abbrev-commit
* 582d922 (HEAD -> master) add author
* 8875536 add comment
* d1be385 (origin/master) init hello
这时,如果已经有人推送了分支,先pull一下,再查看状态。加上刚才合并的提交,本地比远程分支超前3个提交。
git log
查看$ git log --graph --pretty=oneline --abbrev-commit
* e0ea545 (HEAD -> master) Merge branch 'master' of github.com:michaelliao/learngit
|\
| * f005ed4 (origin/master) set exit=1
* | 582d922 add author
* | 8875536 add comment
|/
* d1be385 init hello
...
$ git log --graph --pretty=oneline --abbrev-commit
* 7e61ed4 (HEAD -> master) add author
* 3611cfe add comment
* f005ed4 (origin/master) set exit=1
* d1be385 init hello
变基前:
变基后:
以master
分支为基,对feature
分支进行变基
git rebase master feature
:特性分支向前移植到master
分支
常用git rebase
操作把本地开发分支移植到远端的origin/分支
上
即为“把你的补丁变基到xxx分支的头”
rebase
最适合的是本地分支喝远端对应跟踪分支之间的合并:
git rebase origin/feature feature
常用:git reabse
或者git pull --rebase
把分叉的提交历史“整理”成一条直线,看上去更直观。
缺点是本地的分叉提交已经被修改过了。
git rebase
本质是将当前基分支和当前分支的差异提交获取到,然后在“基分支”最新提交点后面讲差异逐个再次提交,最后将HEAD
指向最新提交点标签就是版本库的快照,指向某个commit id
的指针。
commit id
绑定git tag <tagname> [commit id]
创建一个标签,默认标签是最新提交的commit上commit id
:git log --pretty=oneline --abbrev-commit
git tag -a <tagname> -m "describe" [commit id]
指定标签信息git tag
查看所有标签git show <tagname>
查看标签信息commit
挂钩commit
既出现在master
分支,也出现在dev
分支,那么在这两个分支上都可以看到这个标签默认标签都只存储在本地,不会推送到远程
git push origin <tagname>
推送一个本地标签去远程库git push origin --tags
推送全部未推送的本地标签到远程库git tag -d <tagname>
删除一个本地标签git push origin :refs/tags/<tagname>
可以删除一个远程标签,但先从本地删除git config --global color.ui true
输出显示颜色
.gitignore
.class
文件# Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: *.py[cod] *.so *.egg *.egg-info dist build # My configurations: db.ini deploy_key_rsa
.gitignore
到gitgit status
提醒working directory clean
git add -f <filename>
.gitignore
规则错误的地方:git check-ignore -v <filename>
.gitignore
里添加例外规则: !
+文件名# 排除所有.开头的隐藏文件:
.*
# 排除所有.class文件:
*.class
# 不排除.gitignore和App.class:
!.gitignore
!App.class
git status
缩减成git st
: git config --global alias.st status
co
表示checkout
:git config --global alias.co checkout
--global
参数是全局参数,全局可用git reset HEAD file
的缩减名git unstage <filename>
:git config --global alias.unstage 'reset HEAD'
git last
显示最后一次提交信息:git config --global alias.last 'log -1'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
--global
的配置文件位置:.git/config
alias
git
:sudo apt-get install git
sudo adduser git
id_rsa.pub
文件/home/git/.ssh/authorized_keys
文件里,一行一个/srv/sample.git
的Git仓库:sudo git init --bare sample.git
.git
结尾git
sudo chown -R git:git sample.git
/etc/passwd
里的git:x:1001:1001:,,,:/home/git:/bin/bash
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
git-shell
就会自动退出git clone git@server:/srv/sample.git
/home/git/.ssh/authorized_keys
curl https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm sudo rpm -ivh /opt/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm sudo yum install -y curl policycoreutils-python openssh-server cronie sudo lokkit -s http -s ssh sudo yum install postfix sudo service postfix start sudo chkconfig postfix on curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ce
gitlab-ctl reconfigure
gitlab-ctl start
gitlab-ctl stop
service firewall stop
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。