git config --global user.name "Your Name"
git config --global user.email "[email protected]"
git status # 查看当前状态
git diff README.TXT # 查看被修改的文件具体修改的内容
# version1 README.txt
Git is a version control system.
Git is free software.
# version2 README.txt
Git is a distributed version control system.
Git is free software.
# version3 README.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
git log 查看历史提交记录,具体时间都显示出来了
将REAME.txt回退到上一个版本
git reset --hard <版本号>
master
,以及指向master
的一个指针叫HEAD
。 git diff HEAD -- readme.txt
,查看工作区和最新版本的区别git checkout -- file
可以丢弃工作区的修改 readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态;git commit
或git add
时的状态--
否则就会变成切换分支git reset HEAD
,可以把暂存区的修改撤销掉(unstage),重新放回工作区: git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。git reset --hard <版本号>
,也可以使用HEAD指针 git rm test.txt
然后就是git commit
这是删除暂存区的文件rm test.txt
是删除工作区的文件git reset HEAD^
回退版本ssh-keygen -t rsa -C "[email protected]"
git remote add origin https://github.com/ds-ebooks/learngit.git
,远程库的名字就是origin
,这是Git默认的叫法 git push -u origin master
加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。 一般直接这样还会报错,加上-f
强制推送git push origin master
https
速度慢,每次推送都必须输入口令 ,建议使用git协议
:[email protected]:ds-books/gitskills.git
master
分支是一条线,Git用master
指向最新的提交,再用HEAD
指向master
,就能确定当前分支,以及当前分支的提交点,更详细分支图例见图解Git # 创建dev分支,此时远程库并没有dev分支,-b表示创建并切换
git checkout -b dev
# 相当于
git branch dev
git checkout dev
# 查看当前分支
git branch
# dev上面完成开发之后,合并到marster分支
git merge dev
# 这时master上面的内容就和dev一样,也就是直接把master指向dev的当前提交,所以合并速度非常快。
# 删除dev分支
git branch -d dev
# 安全起见,使用分支完成某个任务,合并后再删掉分支
Fast forward
模式,删除分支后,会丢掉分支信息Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息git merge --no-ff -m "merge with no-ff" dev
,加上--no-ff
强制禁用Fast forward
模式fast forword
模式是看不出来分支合并信息的stash
将工作现场储存起来,等之后再回来继续开发issue-101
分支修复bug,git checkout -b issue-101
# 查看当前分支(dev),发现未提交的文件,但由于未完成,所以不想提交
git status
# 保存当前分支未提交的文件,即保存工作现场
git stash
# 假设master分支的bug需要修复
git checkout master
# 创建master的分支issue-101修复bug
git checkout -b issue-101
# 修复完bug之后,提交并合并
git add .
git commit -m "fix bug 101"
git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101
# 切换至dev分支进行未完成的开发
git status # 发现工作区是干净的
git stash list # 此时应该可以看到之前保存的信息
# 方式一
git stash apply # 恢复,但是恢复后,stash内容并不删除
git stash drop #删除stash内容
# 方式二
git stash pop # 相当于上面的两步
git stash list # 此时就看不到保存的工作区现场了
# 对于多次stash
# 先查看stash
git stash list
# 再指定恢复的的现场
git stash apply stash@{0}
# 开发代号为Vulcan的新功能
git checkout -b feature-vulcan
# 之后就是git add, git commit
# 切回dev合并
git checkout dev
git branch -d feature-vulcan
# 如果此时还未提交,但由于紧急情况需要取消该任务,该分支必须删除的时候
git branch -d feature-vulcan # 发现并不能删除分支
# 强行删除
git branch -D feature-vulcan
git remove
查看远程库的信息或者git remove -v
查看更详细的信息
抓取分支:
git checkout -b dev origin/dev
就必须创建远程origin
的dev
分支到本地 origin/dev
分支推送了他的提交,而碰巧你也对同样的文件作了修改,此时你push就会冲突git pull
把最新的提交从origin/dev
抓下来,然后,在本地合并,解决冲突,再推送 ,注意# 指定本地dev分支与远程origin/dev分支的链接
git branch --set-upstream-to=origin/dev dev
# 之后再pull
git pull
# 出现合并冲突--解决方法同上
# 最后push
git push origin dev
具体模式:
git push origin
推送自己的修改;git pull
试图合并;git push origin
推送就能成功!git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/
。 git rebase
# 切换打标签的分支
git branch
git checkout master
# 然后就可以打标签了
git tag v1.0
# 查看所有标签
git tag
# 为过去的提交打标签
git log --pretty=oneline --abbrev-commit
git tag v0.9 a793aa9 # a793aa9是commit id
# 标签是按字母排序的,可以查看标签信息
git show
# 创建带有说明的标签,用-a指定标签名,-m指定说明文字:
git tag -a v0.1 -m "version 0.1 released" 1094adb
# 插卡说明文字
git show
# 删除标签
git tag -d v1.0
# 将某个标签对应的版本推送到远程仓
git push origin v1.0
# 一次性推送全部尚未推送的本地标签
git push origin --tags
# 删除远程标签
# 先本机删除
git tag -d v0.9
# 再远程删除
git push origin :refs/tags/v0.9
# 让Git显示颜色
git config --global color.ui true
.gitignore
文件,里面填的文件名或文件夹在git add和git commit过程中都不起作用,不会被提交,一般情况下github已经个我们写好了模板:gitignore.gitignore
的格式,在里面你可以这样写:# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
-f
参数,git add -f App.class
# 配置lg,查看分支合并情况
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
# 安装git
sudo apt-get install git
# 创建一个git用户,用来运行git服务
sudo adduser git
# 创建证书登录
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,
把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个
# 初始化Git仓库
# 先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
sudo git init --bare sample.git
sudo chown -R git:git sample.git
# 禁用shell登录
# 编辑/etc/passwd文件完成
git:x:1001:1001:,,,:/home/git:/bin/bash
# 改为一旦登录就自动退出:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
# 克隆远程仓库
git clone git@server:/srv/sample.git
# 管理公钥
/home/git/.ssh/authorized_keys
# 管理权限