快速上手Git操作

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用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

添加远程仓库

  1. 生成SSH key,在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:ssh-keygen -t rsa -C "youremail@example.com"
  2. 登陆GitHub,打开“Account settings”,“SSH Keys”页面,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
  3. 在本地的仓库下运行命令: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解决冲突

  1. git status查看冲突的文件
  2. 直接查看和修改有冲突的文件
  3. git add filename.txt
  4. git commit -m "conflict fixed"

git log --graph --pretty=oneline --abbrev-commit 可以看到分支的合并情况

Bug分支

  1. git stash 保存当前dev工作区的数据
  2. 创建bug 分支
  3. 修改并合并bug 分支
  4. 切换到dev分支
  5. git stash list 查看stash内容
  6. git stash pop 恢复保存的数据,恢复的同时把stash内容也删了
  7. 或者使用 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分支,那么在这两个分支上都可以看到这个标签。

常用命令

常用命令.png

此文感谢廖雪峰老师的git教程

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,855评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,904评论 0 11
  • 1,查看所有远程分支:%git branch -r 2, 拉取远程分支并创建本地分支git checkout -...
    will666阅读 2,055评论 0 18
  • Q:什么时候会调用拷贝构造函数? A:1.一个对象以值传递的形式传入函数体(实参传递给形参的实际上是实参的拷贝对象...
    凉拌姨妈好吃阅读 1,197评论 0 1
  • 这一天的烦闷,无法形容。许小禾好不容易把孩子哄睡了,她盯着墙上的钟,已经一个小时了。 如今对于“马上”这两个字,许...
    司南A阅读 69评论 0 2