Git相关命令

   Git是linux之父Linus的另一个伟大作品,一款开源并且高效的版本控制软件,2005年诞生开始就用于linux内核的代码版本控制。git的功能和svn类似,但有两个显著的特点:

   一是分布式。每个人的电脑即可以是客户端,也可以是一台服务器,每个人都可以在自己电脑上进行代码的本地提交,维护版本,而不影响其它人,等到项目阶段性完成再将代码同步到服务器,svn则只能统一提交到服务器才有日志信息。

   二是可以快速开分支。同一套代码上,处理不同的需求,就可以开不同的分支,因为分支的实现机制,开分支可以在瞬间完成,并且可以在各个分支之间快速切换。如果是用svn,要么是一个文件夹拷贝好几份,要么是找管理员开分支,再给相关人员开权限。

   当然,git也有某些缺点,比如不能针对任意目录设置访问权限和目录映射(可以通过小版本库的方式间接实现)。

   现在已经用git进行版本管理的大公司有:谷歌、facebook、微软、twitter和linkedin等,用git进行版本管理的项目有:linux内核、安卓、QT、GNOME、KDE和eclips等。

 

相关命令:

 

1、安装Git

 

$sudo apt-get install git 

 

         2、配置Name和Email

$ git config --global user.name "Your Name"
$ git config --global user.email "Your email"
# --global参数表示你这台机器上所有的Git仓库都会使用这个配置,
# 当然也可以对某个仓库指定不同的用户名和Email地址。
# 也可以打开仓库下 .git/config 文件进行修改  

$ ssh-keygen -o -t rsa -b 4096 -C "your email"

然后查看公钥文件复制粘贴到github网站上

3、创建版本库

$ mkdir learngit
$ cd learngit
$ git init
# 一个目录就可以作为版本库,通过 git init 初始化版本库  

 

4、添加文件到暂存区

$ git add readme.txt
# 可以一次提交多个文件,如 git add file1 file2 file3
# 每次修改文件后都要将文件添加到暂存区    

5、提交到仓库

$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file                                          
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt
# 仅仅只是将暂存区代码提交到仓库

6、状态查看

$ 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 show 
$ git show commit_id

7、文件比较

$ git diff readme.txt 
# 和版本库中代码对比
$ git diff HEAD -- readme.txt
# 查看工作区和版本库里面最新版本的区别   

8、历史记录查看

$ git log
commit 1590ae01b0efe50a4867df27fe1c99944810c6f9                                             
Author: Jack-Huys <1368237360@qq.com>
Date:   Thu Oct 31 10:05:10 2019 +0800

    JSNet v1.0
$ git log --oneline
1590ae0 JSNet v1.0
# 显示从最近到最远的提交日志,最前面的数字 1590ae0 是 commit id

9、版本回退

$ git reset --hard HEAD^
# 在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^                            
$ git reset --hard commit_id
# 例如:git reset --hard 1590ae0
# 因为是操作HEAD指针,版本回退就是改变HEAD指针指向,因此非常快

10、查看历史命令记录

$ git reflog   

11、丢弃工作区的修改

$ git checkout -- readme.txt
# git checkout -- file 中的 -- 很重要
# 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
# 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。              
# 总之,就是让这个文件回到最近一次git commit或git add时的状态

12、撤销暂存区修改

$ git reset HEAD readme.txt                                                                
# 撤销暂存区修改,放回工作区

13、从版本库中删除文件

$ git rm test.txt
rm 'test.txt'

# 从版本库中删除文件,但不删除文件
$ git rm <file> --cached

$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt
# 用 git rm 删除,用 git commit 提交修改

 

14、工作区文件误删恢复

$ git checkout -- readme.txt
# 用版本库中的版本替换工作区的版本,无论修改还是删除,都可以一键还原

15、关联Github远程仓库

$ git remote add origin git@github.com:Jack-Huys/learngit.git
$ git push -u origin master
# 把Jack-Huys换成自己的用户名
# 远程库的名字就是origin,这是Git默认的叫法,也可以改成别的
# push 把本地master分支推送到远程,加上了-u参数,可是使本地master和远程master关联                    
# 以后就可以使用命令git push origin master推送最新修改
# 显示远程库origin里的资源 
$ git remote show origin

16、从远程库克隆到本地

$ git clone git@github.com:git@github.com:Jack-Huys/learngit.git
$ git clone https://github.com/Jack-Huys/learngit.git
# 以上两个地址都可以,但第一个仅限于用户将自己的SSH Pub Key添加到Github才行 

17、创建并切换分支

$ git checkout -b dev
# git checkout命令加上-b参数表示创建并切换,等价于以下两条命令:
$ git branch dev
$ git checkout dev
# 新版的 git 用 switch 来表示切换 

18、分支查看

$ git branch                                                                               
* dev
  master

 

19、分支合并

$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)
# git merge命令用于合并指定分支到当前分支。
$ git merge --no-ff -m "merge with no-ff" dev
# --no-ff参数,表示禁用Fast forward,-m 添加commit描述 

20、删除分支

$ git branch -d dev
Deleted branch dev (was b17d20e).
$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e)                                               
# -d 删除已合并分支
# -D 强制删除分支,可以是未合并的

21、分支合并图查看

git log --graph --oneline    

22、存储工作区,后续可恢复

$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge                     
# 由于工作区的内容还未完成,也没有提交到当前分支
# 且需要切换到其他分支,此时可以将工作区存储起来,后续再恢复现场

23、查看stash

$ git stash list
stash@{0}: WIP on dev: f52c633 add merge  

24、恢复存储工作区

$ git stash pop
# 等价于用 git stash apply 恢复,但是恢复后,stash内容并不删除                                   
# 你需要用 git stash drop 来删除
# 也可以用 git stash apply stash@{0} 恢复指定的 stash

25、复制特定提交到当前分支

$ git cherry-pick 4c805e2
[master 1d4b803] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)
# 在master分支上修复的bug,想要合并到当前dev分支
# 可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支

26、显示远程仓库信息

$ git remote
origin
$ git remote -v
origin  git@github.com:git@github.com:Jack-Huys/learngit.git (fetch)
origin  git@github.com:git@github.com:Jack-Huys/learngit.git (push)
# 从远程仓库克隆时,Git自动把本地的master分支和远程的master分支对应起来了
# 远程仓库的默认名称是origin。用 git remote -v 显示更详细的信息,没有权限则看不到push的地址 

 

27、推送主分支或开发分支

$ git push origin master                                                                  
$ git push origin dev

28、建立本地分支和远程分支的关联(本地分支不存在)

$ git branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
$ git pull
Auto-merging env.txt
CONFLICT (add/add): Merge conflict in env.txt
# 如果 git pull 提示 no tracking information,则说明本地分支和远程分支的链接关系没有创建            
# 用命令 git branch --set-upstream-to <branch-name> origin/<branch-name>

29、本地创建和远程分支对应的分支并关联起来

$ git checkout -b branch-name origin/branch-name
$ git branch --set-upstream branch-name origin/branch-name

30、rebase 改变基准

$ git log --graph --pretty=oneline --abbrev-commit
*   e0ea545 (HEAD -> master) Merge branch 'master' of github.com:michaelliao/learngit    
|\  
| * f005ed4 (origin/master) set exit=1
* | 582d922 add author
* | 8875536 add comment
|/  
* d1be385 init hello
$ git rebase
First, rewinding head to replay your work on top of it...
Applying: add comment
Using index info to reconstruct a base tree...
M   hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py
Applying: add author
Using index info to reconstruct a base tree...
M   hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py
$ git log --graph --pretty=oneline --abbrev-commit
* 7e61ed4 (HEAD -> master) add author
* 3611cfe add comment
* f005ed4 (origin/master) set exit=1
* d1be385 init hello
# 使用 rebase 可以把本地未push的分叉提交历史整理成直线
# rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

31、打标签和查看所有标签

$ git tag v1.0
$ git tag
v1.0
# 先切换到需要打标签的分支上,用 git tag tag_name
# 默认标签是打在最新提交的commit上的,即 HEAD
# 可以使用 -a 指定标签名,-m 指定说明文字: 
# $ git tag -a v0.1 -m "version 0.1 released" 1094adb  

32、给历史提交的 commit 打标签

$ git log --pretty=oneline --abbrev-commit
12a631b (HEAD -> master, tag: v1.0, origin/master) merged bug fix 101                    
4c805e2 fix bug 101
e1e9c68 merge with no-ff
f52c633 add merge
cf810e4 conflict fixed
5dc6824 & simple
14096d0 AND simple
b17d20e branch test
d46f35e remove test.txt
$ git tag v0.9 f52c633
# 用 git log 找到 commit_id,然后使用 git tag tag_name commit_id 即可

33、查看标签信息

$ git show v0.9
commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)                               
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:56:54 2018 +0800

    add merge

diff --git a/readme.txt b/readme.txt

34、删除本地标签

$ git tag -d v0.1
Deleted tag 'v0.1' (was f15b0dd) 

 

35、推送本地标签到远程

$ git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
 * [new tag]         v1.0 -> v1.0
# 使用 git push origin --tags 可以一次性将所有本地全部推送到远程   

36、删除远程标签

$ git tag -d v0.9
Deleted tag 'v0.9' (was f52c633)
$ git push origin :refs/tags/v0.9
To github.com:michaelliao/learngit.git
 - [deleted]         v0.9
# 需要先在本地删除,然后使用 push 删除远程标签   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值