参考文章:
Git 常用命令详解(二)
.gitignore 文件
作用: 忽略某些文件或文件夹
在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如
target
bin
*.db
工作区和暂存区的概念
git add
实际上是把文件修改添加到暂存区
git commit
实际上是把暂存区的东西添加到当前分支
可用git status 查看当前分支状态
git基础命令
git rm
:从当前的工作空间中和索引中删除文件,例如'git rm app/model/user.rb'
git commit
:提交当前工作空间的修改内容,例如'git commit -m story #3, add user model',提交的时候必须用-m来输入一条提交信息
git log
:查看历史日志
git revert
:还原一个版本的修改,必须提供一个具体的Git版本号,例如'git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20',Git的版本号都是生成的一个哈希值
git reset
:将当前的工作目录完全回滚到指定的版本号
git stash
:将当前未提交的工作存入Git工作栈中,时机成熟的时候再应用回来,这里暂时提一下这个命令的用法,后面在技巧篇会重点讲解
git config
:利用这个命令可以新增、更改Git的各种设置
.git文件夹
在代码根目录下有一个.git文件夹,有几个比较重要的文件和目录需要解释一下:
HEAD文件存放根节点的信息,其实目录结构就表示一个树型结构,Git采用这种树形结构来存储版本信息,那么HEAD就表示根;
refs目录存储了你在当前版本控制目录下的各种不同引用(引用指的是你本地和远程所用到的各个树分支的信息),它有heads、remotes、stash、tags四个子目录,分别存储对不同的根、远程版本库、Git栈和标签的四种引用,你可以通过命令'git show-ref'更清晰地查看引用信息;
logs目录根据不同的引用存储了日志信息。
git clone
1)git clone
:这是一种较为简单的初始化方式,当你已经有一个远程的Git版本库,只需要在本地克隆一份
例如:git clone git://github.com/someone/some_project.git some_project
上面的命令就是将'git://github.com/someone/some_project.git'这个URL地址的远程版本库,完全克隆到本地some_project目录下
如果你使用git clone
命令克隆了一个仓库,命令会自动将其添加为远程仓库(git remote -v
)并默认以 “origin” 为简写。
git init 初始化
2)git init
和 git remote
:这种方式稍微复杂一些,当你本地创建了一个工作目录,你可以进入这个目录,使用git init
命令进行初始化;Git以后就会对该目录下的文件进行版本控制,这时候如果你需要将它放到远程服务器上,可以在远程服务器上创建一个目录,并把可访问的URL记录下来,此时你就可以利用git remote add
命令来增加一个远程服务器端,
例如:git remote add origin git://github.com/someone/another_project.git
上面的命令就会增加URL地址为'git: //github.com/someone/another_project.git',名称为origin的远程服务器,以后提交代码的时候只需要使用 origin别名即可
- 修改origin
git remote set-url [name] [new_Url]
4)查看远程仓库
git remote -v
git branch 分支
本地分支
查看本地分支:$ git branch
查看远程分支:$ git branch -r
创建本地分支:$ git branch [name]
----注意新分支创建后不会自动切换为当前分支
创建新分支并立即切换到新分支:$ git checkout -b [name]
删除分支:$ git branch -d [name]
-d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
合并分支:$ git merge [name]
将名称为[name]的分支与当前分支合并
远程分支
查看远程分支:$ git branch -r
创建远程分支(本地分支push到远程):$ git push origin [name]
删除远程分支:$ git push origin :heads/[name]
或 $ gitpush origin :[name]
- 创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则会被强制删干净没得后悔)
$git symbolic-ref HEAD refs/heads/[name]
$rm .git/index
$git clean -fdx
git checkout
切换分支:$ git checkout [name]
checkout:Git的checkout有两个作用,其一是在不同的branch之间进行切换,另一个功能是还原代码的作用,例如git checkout app/model/user.rb
就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚
git checkout -- readme.txt
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
-
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
-
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git stash 暂存工作现场
工作进行到一半,还不想提交.可以用git stash
把工作现场存储起来(没有git add
或 git commit
) ------假设该分支为 wechat
储存起来后,使用 git status
查看当前分支状态,此时是干净的工作区
如果此时需要在master分支上修复BUG,切换到master分支, 再创建新分支进行BUG修改; 完全不会影响到wechat分支的代码.
在新分支修改完BUG后, 合并到master分支push
到远端代码版本后,可以切换回wechat分支继续之前的工作.
使用 git stash list
查看刚刚暂存的工作,我们需要恢复工作区. 执行 git stash apply
命令恢复工作区,恢复后可自行删除暂存 git stash drop
当然有一个更简便的方法恢复工作区并删除stash暂存: git stash pop
如果stash有多个暂存时,我们可以指定恢复(git stash apply stash@{0}
) 或 指定删除(git stash drop stash@{0}
) 某个stash.
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit id>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
git log :查看提交日志
git log --pretty=oneline
查看提交日志(只打印commit id和描述)
git status : 仓库当前的状态
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt
被修改过了,但还没有准备提交的修改。
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
git status
告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了
$ git status
On branch master
nothing to commit, working tree clean
Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的
可以用git log查看提交日志
git diff: 查看difference
git diff HEAD -- readme.tx 可以查看工作区和版本库里面最新版本的区别
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
git rebase 解决冲突
1.拉取远程代码 到 master
2.新建本地分支 local
3.在本地分支提交代码 commit
4.切换到本地 master分支, 重新拉取远程代码, 发现此时已经有其他人 提交了代码
5.切换到 local 分支, 执行 git rebase master
情况1: 没有冲突, 切换到master 分支 执行 git merge local
, 并提交 git push
情况2: 有冲突, 先手动解决冲突; 解决冲突后, git add
一下, git rebase --continue
, 如果没有冲突了, 可以执行合并分支并推送到远程
git rm 删除文件/文件夹
git rm -r --cached target
删除远程仓库 target文件夹,删除后提交即可
git rm target
删除本地 target文件夹,删除后提交即可
git reset & git reflog(回退版本/撤销暂存区修改 & 查看命令日志)
在Git中,用HEAD表示当前版本
git reflog
: 用来记录你的每一次命令,以便确定回退未来的commit id
git reset --hard commit_id
git reset --hard HEAD^
回退到上一个版本
git reset --hard HEAD~100
回退到往上100个版本
git reset HEAD <file>
把暂存区的修改撤销掉(unstage),重新放回工作区
远程主机名一般为origin,或者 为其他
git fetch
git fetch [远程主机名] [BranchName]:[LocalBranchName]
相当于是从远程获取master(BranchName)最新版本到本地分支,不会自动merge
如: git fetch
//创建并更新本地远程分支
git fetch orgin
//手动制定了远程主机,不指定分支时默认为master分支
git fetch orgin master
//从远程获取master分支最新版本到本地分支
git fetch orgin master:temp
//从远程获取master分支最新版本到本地temp分支
git log -p master ..origin/master
//比较本地的master分支和origin/master分支的差别
git merge origin/master
//进行合并远程仓库的master到本地
git pull
git pull [remoteName] [localBranchName]
等于是从远程获取最新版本并merge到本地分支
git pull origin master
//相当于git fetch 和 git merge
git push
推送远程仓库:$ git push [remoteName] [localBranchName]
$git push origin test:master
// 提交本地test分支作为远程的master分支
$git push origin test:test
// 提交本地test分支作为远程的test分支