您的位置:首页 > 其它

git 常用操作集锦

2014-05-31 09:18 204 查看

创建仓库

新建普通仓库:

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 命令可以回退到指定的提交处,然后修改这次提交之后的历史。

包含的功能:

pick,采用这次提交,什么也不做
reword,采用这次提交,只是修改提交信息
edit,采用提交,并停在这次提交这里,你可以开始修改这次提交
squash,合并提交,将这次提交合并到之前的一次提交里面
fixup,与squash 一致,直接合并忽略提交信息
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: