Git配置
Git配置查看
git config --list
or
git config user.name
git config user.email
Git账户设置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
Git颜色显示
git config --global color.ui true
Git忽略文件设置
新建一个.gitignore文件
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
- 有些时候,你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore忽略了。
git add -f App.class
可以强制添加- 查看哪个规则拦截了,
git check-ignore -v App.class
配置别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'
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"
配置文件
配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[alias]
last = log -1
别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:
$ cat .gitconfig
[alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name = Your Name
email = your@email.com
版本库创建
在想创建仓库的文件目录下执行如下命令:
git init
ps:可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用
ls -ah
命令就可以看见
添加文件到暂存区
git add readme.txt
git add file1.txt file2.txt
- 使用git status 命令可以查看暂存区的内容存储情况
- 不管是新增文件还是修改仓库中的文件,commit之前都要add到暂存区
提交文件至本机master分支
git commit file1.txt -m "message"
git commit -m "message"
ps:commit 只会提交暂存区的文件到本机master分支
查看仓库状态
git status
ps:仓库当前的状态,可以看到哪些文件被修改了,哪些文件没被add,哪些文件被add了
查看文件的修改内容
git diff filename.txt
查看最近的提交记录
git log
git log --pretty=oneline
此命令只适用于查看当前窗口最近的命令,如果窗口重新打开后,想查看所有的命令历史,使用
git reflog
版本回退
git reset --hard HEAD^
git reset --hard HEAD~100
git reset --hard 1094a
- 在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
- 1094a是版本号,版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
丢弃工作区的修改
git checkout -- filename.txt
- 如果文件自修改后还没被存放到暂存取,撤销修改就会和版本库里一模一样。
- 如果文件已添加到暂存区,又作了修改,撤销修改就会回到添加暂存区后的状态。
- 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>
,第二步用命令git checkout
删除文件
git rm filename.txt
git commit -m "remove test.txt"
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
添加远程仓库
- 生成SSH key,在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
- 登陆GitHub,打开“Account settings”,“SSH Keys”页面,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
- 在本地的仓库下运行命令:
git remote add origin git@github.com:michaelliao/learngit.git
git@github.com:michaelliao/learngit.git为远程仓库地址
本地库内容推送到远程仓库
git push -u origin master
每次本地提交后,只要有必要,就可以使用命令
git push origin master推送最新修改
从远程库克隆
git clone git@github.com:michaelliao/gitskills.git
Git分支
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
Fast forward模式合并某分支到当前分支:git merge <name>
强制禁用Fast forward模式合并某分支到当前分支:git merge --no-ff -m <comment> <name>
删除分支:git branch -d <name>
Git解决冲突
- git status查看冲突的文件
- 直接查看和修改有冲突的文件
- git add filename.txt
- git commit -m "conflict fixed"
git log --graph --pretty=oneline --abbrev-commit
可以看到分支的合并情况
Bug分支
-
git stash
保存当前dev工作区的数据 - 创建bug 分支
- 修改并合并bug 分支
- 切换到dev分支
-
git stash list
查看stash内容 -
git stash pop
恢复保存的数据,恢复的同时把stash内容也删了 - 或者使用
git stash apply stash@{0}
和git stash drop stash@{0}
恢复保存的数据
Feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
多人协作
查看远程库的信息: git remote
显示更详细的信息: git remote -v
$ git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
推送分支: git push origin <branch-name>
- master分支是主分支,因此要时刻与远程同步;
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
更新分支: git pull
- git pull 如果提示There is no tracking information for the current branch. 可以使用
git branch --set-upstream-to <branch-name> origin/<branch-name>
- git pull 如果提示fatal: refusing to merge unrelated histories
可以使用git pull --allow-unrelated-histories
解决- 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交
- 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致
Rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
标签
- 打标签:
git tag <name>
或者git tag <name> <commit id>
- 创建带有说明的标签:
git tag -a <name> -m "version 0.1 released" <commit id>
- 查看标签:
git tag
- 查看标签信息:
git show <tagname>
- 删除标签:
git tag -d <tagname>
- 推送某个标签到远程:
git push origin <tagname>
- 一次性推送全部尚未推送到远程的本地标签:
git push origin --tags
- 删除远程标签: 1.
git tag -d <tagname>
2.git push origin :refs/tags/<tagname>
标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。