首页 > 代码库 > git 常用操作集锦

git 常用操作集锦

 

创建仓库

新建普通仓库:

jxdong@ubuntu-server:~/workspace/git$ git init 
Reinitialized existing Git repository in /home/jxdong/workspace/git/.git/

新建 bare 仓库:

jxdong@ubuntu-server:~/workspace/git.git$ git init --bare 
Initialized empty Git repository in /home/jxdong/workspace/git.git/

bare 仓库里面不包含源代码,只具有版本管理管理功能,无法执行 checkout 等代码管理操作:
jxdong@ubuntu-server:~/workspace/git.git$ ls 
branches  config  description  HEAD  hooks  info  objects  refs

 

克隆仓库

克隆普通 git 仓库:

jxdong@ubuntu-server:~/workspace$ git clone git git_1
Cloning into ‘git_1‘...
done.
warning: You appear to have cloned an empty repository.

克隆为 bare 仓库:

jxdong@ubuntu-server:~/workspace$ git clone git git_1.git --bare  
Cloning into bare repository ‘git_1.git‘...
done.
warning: You appear to have cloned an empty repository.

因为我们的仓库里面没有提交,所以 git 提示我们克隆了空的仓库

 

提交代码

第一次提交初始化的版本可以是什么都没有:

jxdong@ubuntu-server:~/workspace/git$ git commit -m "init: first version." --allow-empty
[master (root-commit) 8a22ddf] init: first version.

jxdong@ubuntu-server:~/workspace/git$ git log 
commit 8a22ddfaaf374531dbdba02ef40bb10006057f6f
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:40:15 2014 +0800
    init: first version.

 

添加项目文件

jxdong@ubuntu-server:~/workspace/git$ echo test > myfile1.txt
jxdong@ubuntu-server:~/workspace/git$ git add myfile1.txt

 

提交到本地仓库


jxdong@ubuntu-server:~/workspace/git$ git commit -m "work: add file1"
[master 8ed6d03] work: add file1
1 file changed, 1 insertion(+)
create mode 100644 myfile1.txt

 

查看历史


jxdong@ubuntu-server:~/workspace/git$ git log 
commit 8ed6d030278c0aef63052d6ba1946281c8a50ec8
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:43:52 2014 +0800
    work: add file1
commit 8a22ddfaaf374531dbdba02ef40bb10006057f6f
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:40:15 2014 +0800
    init: first version.

 

回退版本

 

作为提交的回退

revert 会撤销一次 commit 并把撤销操作作为 commit 提交,所以历史里面包含这次撤销操作的 commit

 

jxdong@ubuntu-server:~/workspace/git$ git log 
commit 746d6596b7d5b84db9c27ceef1063be977510c4e
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:44:22 2014 +0800
    Revert "work: add file1"
    This reverts commit 8ed6d030278c0aef63052d6ba1946281c8a50ec8.
commit 8ed6d030278c0aef63052d6ba1946281c8a50ec8
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:43:52 2014 +0800
    work: add file1
commit 8a22ddfaaf374531dbdba02ef40bb10006057f6f
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:40:15 2014 +0800
    init: first version.
jxdong@ubuntu-server:~/workspace/git$ ls

 

强制删除一次提交

reset 与 –hard 参数,将会真正去掉这次commit, 将会删除 git 历史。比较危险,用于那些失败的 提交。

jxdong@ubuntu-server:~/workspace/git$ git reset --hard HEAD~1
HEAD is now at 8ed6d03 work: add file1
jxdong@ubuntu-server:~/workspace/git$ git log 
commit 8ed6d030278c0aef63052d6ba1946281c8a50ec8
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:43:52 2014 +0800
    work: add file1
commit 8a22ddfaaf374531dbdba02ef40bb10006057f6f
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:40:15 2014 +0800
    init: first version.
jxdong@ubuntu-server:~/workspace/git$ ls 
myfile1.txt

 

修改提交历史

 

我们再添加一个文件,并提交。

jxdong@ubuntu-server:~/workspace/git$ echo test > myfile2.txt  
jxdong@ubuntu-server:~/workspace/git$ git add myfile2.txt
jxdong@ubuntu-server:~/workspace/git$ git commit -m "work: add file2"
[master 021f89c] work: add file2
1 file changed, 1 insertion(+)
create mode 100644 myfile2.txt
jxdong@ubuntu-server:~/workspace/git$ git log 
commit 021f89cfd5aa195cd841eb0e64a2d712cc1f8356
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:45:49 2014 +0800
    work: add file2
commit 8ed6d030278c0aef63052d6ba1946281c8a50ec8
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:43:52 2014 +0800
    work: add file1
commit 8a22ddfaaf374531dbdba02ef40bb10006057f6f
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:40:15 2014 +0800
    init: first version.

 

rebase 命令可以回退到指定的提交处,然后修改这次提交之后的历史。

包含的功能:

  1. pick,采用这次提交,什么也不做
  2. reword,采用这次提交,只是修改提交信息
  3. edit,采用提交,并停在这次提交这里,你可以开始修改这次提交
  4. squash,合并提交,将这次提交合并到之前的一次提交里面
  5. fixup,与squash 一致,直接合并忽略提交信息
  6. x,exec,执行一些命令

这里以合并为例

jxdong@ubuntu-server:~/workspace/git$ git rebase -i 8a22ddfaaf374531dbdba02ef40bb10006057f6f
pick 8ed6d03 work: add file1
pick 021f89c work: add file2
# Rebase 8a22ddf..021f89c onto 8a22ddf
#
# 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
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

".git/rebase-merge/git-rebase-todo" 16L, 542C written                                 
Rebasing (2/2)
# This is a combination of 2 commits.
# The first commit‘s message is:
work: add file1
# This is the 2nd commit message:
work: add file2
# Please enter the commit message for your changes. Lines starting
# with ‘#‘ will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   myfile1.txt
#       new file:   myfile2.txt
#
                                                                                                            
~                                                                                                       
".git/COMMIT_EDITMSG" 18L, 438C written
[detached HEAD a5d9008] work: add file1
2 files changed, 2 insertions(+)
create mode 100644 myfile1.txt
create mode 100644 myfile2.txt
Successfully rebased and updated refs/heads/master.

 

看一下,合并后的历史
jxdong@ubuntu-server:~/workspace/git$ git log 
commit a5d9008e0d87302ed1dc9c5fa8957294efc3e403
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:43:52 2014 +0800
    work: add file1
    work: add file2
commit 8a22ddfaaf374531dbdba02ef40bb10006057f6f
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:40:15 2014 +0800
    init: first version.

 

生成补丁

 

补丁的生成,-n 后面数字表示将要生成之前的多少次提交作为布丁。

jxdong@ubuntu-server:~/workspace/git$ git format-patch -n1
0001-work-add-file1.patch

 

应用布丁

 

应用布丁,需要具有相同祖先的 git 仓库,以避免错误,我们开始克隆过一个仓库,他们是来自同一个祖先

jxdong@ubuntu-server:~/workspace/git$ cd ..
jxdong@ubuntu-server:~/workspace$ cd git
git/       git_1/     git_1.git/ git.git/   
jxdong@ubuntu-server:~/workspace$ cd git_1
git_1/     git_1.git/ 
jxdong@ubuntu-server:~/workspace$ cd git_1
jxdong@ubuntu-server:~/workspace/git_1$ git am ../git/0001-work-add-file1.patch
Applying: work: add file1
applying to an empty history

 

获取远端仓库代码

 

添加远端

jxdong@ubuntu-server:~/workspace/git_1$ git remote add git ../git

获取代码


jxdong@ubuntu-server:~/workspace/git_1$ git fetch git 
warning: no common commits
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.
From ../git
* [new branch]      master     -> git/master

 

查看所有分支

jxdong@ubuntu-server:~/workspace/git_1$ git branch -a
* master
  remotes/git/master

 

表示当前在本地的 master 分支,我们还有一个远端叫 git 的仓库,里面包含一个 master 分支

 

合并分支

 

我们先在分支上再提交一次,这次也添加一个文件。

jxdong@ubuntu-server:~/workspace/git_1$ echo test2 > myfile2.txt 
jxdong@ubuntu-server:~/workspace/git_1$ git commit -m "work: modfy file2"
# 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:   myfile2.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
jxdong@ubuntu-server:~/workspace/git_1$ git commit -am "work: modfy file2"
[master 503a6c9] work: modfy file2
1 file changed, 1 insertion(+), 1 deletion(-)
jxdong@ubuntu-server:~/workspace/git_1$ git log 
commit 503a6c922a6a0f0fc298c1b5b8289fd2babb435c
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:50:30 2014 +0800
    work: modfy file2
commit 24651eb534f5f4db86e61e62f48d7959aaaf4e65
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:43:52 2014 +0800
    work: add file1
    work: add file2

 

合并分支

jxdong@ubuntu-server:~/workspace/git_1$ git merge git/master 
Auto-merging myfile2.txt
CONFLICT (add/add): Merge conflict in myfile2.txt
Automatic merge failed; fix conflicts and then commit the result.

 

处理冲突

 

首先查看冲突


jxdong@ubuntu-server:~/workspace/git_1$ git diff
diff --cc myfile2.txt
index 180cf83,9daeafb..0000000
--- a/myfile2.txt
+++ b/myfile2.txt
@@@ -1,1 -1,1 +1,5 @@@
++<<<<<<< HEAD
+test2
++=======
+ test
++>>>>>>> git/master

 

修改冲突并提交

解决冲突主要是看需要保留本地的内容还是要合并的内容

jxdong@ubuntu-server:~/workspace/git_1$ git commit -a
Merge remote-tracking branch ‘git/master‘
Conflicts:
        myfile2.txt
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
#       .git/MERGE_HEAD
# and try again.
# Please enter the commit message for your changes. Lines starting
# with ‘#‘ will be ignored, and an empty message aborts the commit.
# On branch master

提交完成合并成功  

jxdong@ubuntu-server:~/workspace/git_1$ git log 
commit d1feccc31ba37983e2d217ec7b497bffebdde3f1
Merge: 503a6c9 a5d9008
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:56:46 2014 +0800
    Merge remote-tracking branch ‘git/master‘
    Conflicts:
        myfile2.txt
commit 503a6c922a6a0f0fc298c1b5b8289fd2babb435c
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:50:30 2014 +0800
    work: modfy file2
commit 24651eb534f5f4db86e61e62f48d7959aaaf4e65
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:43:52 2014 +0800
    work: add file1
    work: add file2
commit a5d9008e0d87302ed1dc9c5fa8957294efc3e403
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:43:52 2014 +0800
    work: add file1
    work: add file2
commit 8a22ddfaaf374531dbdba02ef40bb10006057f6f
Author: Royce Jiang <jiangxd@embedinfo.com>
Date:   Fri May 30 11:40:15 2014 +0800