Git操作

1. 基本操作

(1) git init

功能:初始化仓库

要使用 Git 进行版本管理,必须先初始化仓库。如果初始化成功,执行了 **git init**命令的目录下就会生成 .git 目录。这个 .git 目录里存储着管理当前目录内容所需的仓库数据。

在 Git 中,我们将工作目录的内容称为“附属于该仓库的工作树”。文件的编辑等操作在工作树中进行,然后记录到仓库中,以此管理文件的历史快照。如果想将文件恢复到原先的状态,可以从仓库中调取之前的快照,在工作树中打开。开发者可以通过这种方式获取以往的文件。

(2) git status

功能:显示 Git 仓库的状态

工作树和仓库在被操作的过程中,状态会不断发生变化。在 Git 操作过程中时常用 **git status**命令查看当前状态,可谓基本中的基本。

(3) git add

功能:向暂存区中添加文件

如果只是用 Git 仓库的工作树创建了文件,那么该文件并不会被记入 Git 仓库的版本管理对象当中。因此如果我们用 **git status**命令查看新创建的文件时,它会显示在 Untracked files 里。要想让文件成为 Git 仓库的管理对象,就需要用 **git add**命令将其加入暂存区(Stage 或者 Index)中。暂存区是提交之前的一个临时区域。

option为., -A, -u的区别:

  • git add -A stages All
  • git add . stages new and modified, without deleted
  • git add -u stages modified and deleted, without new

Ref:
http://stackoverflow.com/a/572660

(4) git commit

功能:保存仓库的历史记录

此命令可以将当前暂存区中的文件实际保存到仓库的历史记录中。通过这些记录,我们就可以在工作树中复原文件。

记述一行提交信息: git commit -m "your commit"

记述详细提交信息: git commit, 然后编辑器会自动启动,在文件内添加至少三行,格式如下(默认存在的注释行不必删除):

  • 第一行:用一行文字简述提交的更改内容
  • 第二行:空行
  • 第三行以后:记述更改的原因和详细内容

中止提交: 如果在编辑器启动后想中止提交,请将提交信息留空(不包括默认存在的#注释行)并直接关闭编辑器,随后提交就会被中止。

git commit -am "commit content": 当你只想提交tracked 文件时,使用此命令代替**git addgit commit -m。如果commit中包含新建的文件(untracked),你就必须首先使用git add <file-name>将此文件添加到暂存区,然后使用git commit**命令。

(5) git log

功能: 查看以往仓库中提交的日志

日志内容包括可以查看什么人在什么时候进行了提交或合并,以及操作前后有怎样的差别。

只显示提交信息的第一行git log --pretty=short

只显示指定目录、文件的日志: git log README.md

显示文件的改动: git log -p

(6) git diff

功能: 查看更改前后的差别

**git diff**命令可以查看 工作树暂存区最新提交之间的差别。


查看工作树和暂存区的差别git diff, 也就是查看工作树版本与未add的版本的区别。

查看暂存区与最新提交版本的差别: git diff --cachedgit diff --staged

查看工作树与最近commit的版本的区别git diff HEAD ,也就是查看工作树版本与最新提交的版本的区别。

比较当前版本和上一个版本差异git diff HEAD^

养成这样一个好习惯:在执行 **git commit命令之前先执行git diff HEAD**命令,查看本次提交与上次提交之间有什么差别,等确认完毕后再进行提交。这里的 HEAD 是指向当前分支中最新一次提交的指针。

查看任意两个版本的区别git diff v1 v2

2. 分支操作

(1) 显示所有本地分支

git branch

当前所在分支带有*

显示所有分支,包括远程分支:

git branch -a

(2) 创建分支

git branch <branch-name>

(3) 切换分支

git checkout <branch-name>			# 切换已经存在的本地分支
git checkout -b <branch-name>		# 创建本地分支,并切换
git checkout -b <branch-name> origin/<branch-name>		# 创建跟远程一样的本地分支,并切换

切换回上一个分支:

git checkout -

(4)删除本地分支

git branch -d <branch_name>

(5)删除远程分支

git push origin --delete <branch_name>

(4) 特性分支

特性分支顾名思义,是集中实现单一特性(主题),除此之外不进行任何作业的分支。在日常开发中,往往会创建数个特性分支,同时在此之外再保留一个随时可以发布软件的稳定分支。稳定分支的角色通常由 master 分支担当。

基于特定主题的作业在特性分支中进行,主题完成后再与 master 分支合并。只要保持这样一个开发流程,就能保证 master 分支可以随时供人查看。

(5) 合并分支

首先切换到 master 分支,然后合并:

git checkout master
git merge --no-ff <branch-name>

(6) 以图表形式查看分支

git log --graph

3. 更改提交的操作

(1) git reset

功能: 回溯历史版本

分三步:

  1. 获取历史commit的哈希值

     git reflog
    

    命令结果e.g.:

     4f2a403 HEAD@{2}: checkout: moving from jiang-branch to master
     4f2a403 HEAD@{3}: checkout: moving from master to jiang-branch
     4f2a403 HEAD@{4}: checkout: moving from jiang-branch to master
     4f2a403 HEAD@{5}: checkout: moving from wang-branch to jiang-branch
     4f2a403 HEAD@{6}: checkout: moving from master to wang-branch
     4f2a403 HEAD@{7}: commit: none
     b493fc7 HEAD@{8}: commit: Add
     02cc03c HEAD@{9}: commit (initial): Initial commit
    

    我们根据日志,可以获得数次commit操作的哈希值(HEAD之前的字符串)

  2. 选择你需要回溯的版本的哈希值,运行以下命令:

     git reset --hard <hash value>
    
  3. 你需要将你的回溯push到remote(比如github):

     git push -f origin master
    

(2) 合并冲突

冲突产生
我们假设有两个branch,一个叫han-branch一个是master;假设han-branch来自于master的上次commit。从同一个commit出发,两个branch对同一段代码有了不同的修改,merge时,冲突就出现了。

冲突的格式
这是冲突的一个例子:

<<<<<<< HEAD
print "I'am master-branch"
=======
print "I'am han-branch"
>>>>>>> han-branch

=======是分隔符,上面的是当前branch的冲突部分;下面是被merge的branch的冲突部分。

解决冲突
你可以直接编辑冲突文件,消除冲突。
冲突解决后,使用以下命令:

git add <file-name>
git commit

(3) git commit --amend

功能: 修改上一条提交信息

命令执行之后,编辑器被打开,你可以修改你的提交信息。

(4) git rebase -i

功能: 压缩历史commit

在合并特性分支之前,如果发现已提交的内容中有些许拼写错误等,不妨提交一个修改,然后将这个修改包含到前一个提交之中,压缩成一个历史记录(commit)。这是个会经常用到的技巧。

举个栗子

使用**git rebase -i HEAD~2**: 将最后两个commit压缩。运行命令后,编辑器会打开,你可以按照注释的建议修改。
需要编辑的文件例子如下:

pick 59a8f42 merge login branch
pick 2a5b7ec spell correction

# Rebase 48d5404..2a5b7ec onto 48d5404 (2 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

解释
(不包括注释语句)下面一行是最新一次提交,上面一行是它之前的提交。前者做了merge工作,后者只做了一次拼写纠错。我们觉得后面的提交似乎存在的意义不大,便想把它合并到前面的提交中去。我们将第二行的pick替换为fixup,就将后面的commit混合进前面的commit里面去了。

4. 推送至远程仓库

(1) git remote add

功能: 添加远程仓库
用法:git remote add <name> <url>

url是你远程仓库的url,name是你为远程仓库url起的一个名字,通常我们叫origin。于是我们建立了一个映射: name --> url

例子
git remote add origin https://github.com/wangjiang0624/TestGit

(2) git push

功能: 推送至远程仓库
用法: git push <-option> <remote-repo-name> <local-branch>:<remote-branch>

例子
git push origin master:master
远程branch可以省略,此时若远程分支不存在,会自动建立与本地分支同名的远程分支。此时可以写成:git push origin master

5. 获取远程仓库

(1) git clone

功能: 获取远程仓库
用法: git clone <remote-repo-url>

clone之后默认只获取master分支,所以你如果需要获取其他分支,还需要输入以下命令:

git checkout -b <branch-name> origin/<branch-name>

(2) git pull

功能: 获取最新的远程仓库分支
用法: git pull origin <remote-branch-name>

6. 标签操作

(1)创建本地标签

git tag <tag_name>

(2)把本地标签push到远程

git push origin <tag_name>

7. reset撤销

(1)撤销本地commit

git reset HEAD~

8. revert操作(已push)

(1)revert到上一个版本

git revert HEAD
git push

(2)revert到某个版本

git checkout <commit_id> .
git commit -m "<comment>"
git push 

Ref
《Github入门与实践》
http://www.ruanyifeng.com/blog/2014/06/git_remote.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值