Git 和 Repo常用命令

时间:2024-04-01 18:04:49

come from : https://www.cnblogs.com/pengdonglin137/p/5813686.html

阅读目录(Content)

 

这篇博客总结的也不错:

git常用及进阶命令总结

Git与Repo入门

 

一、初始環境配置

git config --global user.name "John Doe"
git config --global user.email [email protected]


git config --global core.editor vim
git config --global color.ui true


git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

 

下面是一份配置好的.gitconfig:

[user]
        name = Peng Donglin
        email = [email protected]
[alias]
        ci = commit
        st = status
        co = checkout
        br = branch
        d = difftool
[core]
        editor = vim
[color]
        ui = true
[sendemail]
        smtpserver = /usr/bin/msmtp
        confirm = auto
[diff]
        tool = vimdiff
[difftool]
        prompt = false
[merge]
        tool = vimdiff
[mergetool]
        prompt = false

使用vimdiff作为 git diff工具

git config --global diff.tool vimdiff
git config --global difftool.prompt false
git config --global alias.d difftool

然后使用 git d 打开对比代码,然后用 :wq 继续比较下一个文件。

 

git merge时使用vimdiff

git config --global merge.tool vimdiff
git config --global mergetool.prompt false

二、常用的命令

  •  .gitignore文件配置的一些规则

 *.a # 忽略所有 .a 结尾的文件 
!lib.a # 但 lib.a 除外 
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO 
build/ # 忽略 build/ 目录下的所有文件 
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

  •  查看已暫存起來的文件跟上次提交時的快照之間的差異

    git diff --cached

  • 查看還沒有暫存起來的改動

    git diff

  • 將已經提交的文件從Git倉庫中刪除,但是本地還保留該文件,即取消跟蹤某個文件

    git rm --cached readme.txt

  • 查看某次提交改動了那些文件

    git log --stat

    git log --stat dd257933fa4b9fea66a1195f8a15111029810abc -1
  • 簡要列出最近的提交commet

 

$git log --pretty=oneline
694d0d0bb2030d2e36df73e2d23d5770511dbc8d Linux 4.8-rc2
0043ee40f98d15a50721fbd5dbf7c7797f8d03cd Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
4ef870e373382f18de214f61e5d5eb83b62b7aa5 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu
  • 列出某人的提交記錄
$git log --author="Linus Torvalds"
commit 694d0d0bb2030d2e36df73e2d23d5770511dbc8d
Author: Linus Torvalds <[email protected]>
Date:   Sun Aug 14 19:11:36 2016 -0700

    Linux 4.8-rc2

commit 0043ee40f98d15a50721fbd5dbf7c7797f8d03cd
Merge: 4ef870e 1577ddf
Author: Linus Torvalds <[email protected]>
Date:   Sun Aug 14 19:01:31 2016 -0700

    Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
    
    Pull thermal updates from Zhang Rui:

 

  如果想過濾掉這個人的merge記錄,可以用 git log --author="Linus Torvalds" --no-merges

  • 取消已經暫存的某個文件

    git reset HEAD readme.txt

  • 查看遠程倉庫的信息

    git remote show origin

  • 查看某個文件的若干行的改動記錄

    git blame -L 12,22 simplegit.rb

  • 获得某次提交的某个文件

    git checkout commit-id  file_name

  • 将本地的tags全部push到远程仓库

    git push origin --tags

  • 将本地分支全部push到远程仓库

    git push --all origin

  • git clean的用法

     git clean -n      显示 将要 删除的 文件 和  目录

     git clean -f  删除当前目录下所有没有track过的文件. 他不会删除.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过.

     git clean -df     删除当前目录下没有被track过的文件和文件夹

     git clean -xfd   删除当前目录下所有没有track过的文件. 不管他是否是.gitignore文件里面指定的文件夹和文件.

 

三、配置git email

 在给linux kernel提交patch的时候一般都使用git send-email。

可以用用下面的命令安装git send-mail:

sudo apt-get install git-email

使用网易的163邮箱配置的方法:

1. 打开网易邮箱的设置界面,查看一下smtp的服务器的地址,如下图所示:

Git 和 Repo常用命令

 2. 修改.gitconfig,如下:

 

[user]
    email = [email protected]
    name = Donglin Peng
[sendemail]
    smtpserver = smtp.163.com
    smtpserverport = 587
    smtpuser = [email protected]
    smtpencryption = ssl
    confirm = auto

 


3. 测试

$git send-email 0001-ASoC-dpcm-print-dai_link-name-of-BE-other-than-FE.patch --to [email protected] 
0001-ASoC-dpcm-print-dai_link-name-of-BE-other-than-FE.patch
(mbox) Adding cc: Donglin Peng <[email protected]> from line 'From: Donglin Peng <[email protected]>'
(body) Adding cc: Donglin Peng <[email protected]> from line 'Signed-off-by: Donglin Peng <[email protected]>'

From: Donglin Peng <[email protected]>
To: [email protected]
Cc: Donglin Peng <[email protected]>
Subject: [PATCH] ASoC: dpcm: print dai_link name of BE other than FE.
Date: Mon, 26 Sep 2016 17:55:36 +0800
Message-Id: <[email protected]>
X-Mailer: git-send-email 2.9.3

Send this email? ([y]es|[n]o|[q]uit|[a]ll): y
Password for 'smtp://[email protected]@smtp.163.com:587': 
OK. Log says:
Server: smtp.163.com
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
RCPT TO:<[email protected]>
From: Donglin Peng <[email protected]>
To: [email protected]
Cc: Donglin Peng <[email protected]>
Subject: [PATCH] ASoC: dpcm: print dai_link name of BE other than FE.
Date: Mon, 26 Sep 2016 17:55:36 +0800
Message-Id: <[email protected]>
X-Mailer: git-send-email 2.9.3

Result: 250 Mail OK queued as smtp5,D9GowAAnL4ea8OhXVnd4Cw--.197S2 1474883745

 

4. 下面是收件箱的内容:

Git 和 Repo常用命令

 

 5. 向linux社区提交patch的时候,发送的邮件必须是纯文本格式,而不能是HTML格式。

 6. 可以参考内核文档:https://www.kernel.org/doc/Documentation/SubmittingPatches

 7. 可以参考博客:

  http://files.cnblogs.com/files/pengdonglin137/Linux_community_and_Upstream_Linux_Codes.pdf

  http://blog.sina.com.cn/s/blog_936739790102v5eu.html

 

用Git打包文件

git archive --format=tar.gz --prefix=Linux-3.16/ v3.16 > Linux-3.16.tar.gz

git archive --format=tar.gz --prefix=Linux-4.17/ 29dcea88779c856c7dc92040a0c01233263101d4 > Linux-4.17.tar.gz

 

 

 repo 常用命令

repo start <topic_name>

  开启一个新的主题,其实就是每个Project都新建一个分支

repo init -u <url> [OPTIONS]

 在当前目录下初始化repo,会在当前目录生生成一个.repo目录,像Git Project下的.git一样,-u指定url,可以加参数-m指定manifest文件,默认是default.xml,.repo/manifests保存manifest文件。.repo/projects下有所有的project的数据信息,repo是一系列git project的集合,每个git project下的.git目录中的refs等目录都是链接到.repo/manifests下的。

repo manifest

可以根据当前各Project的版本信息生成一个manifest文件

repo sync [PROJECT1...PROJECTN]

 同步Code。

repo status

 查看本地所有Project的修改,在每个修改的文件前有两个字符,第一个字符表示暂存区的状态。

- no change same in HEAD and index
A added not in HEAD, in index
M modified in HEAD, modified in index
D deleted in HEAD, not in index
R renamed not in HEAD, path changed in index
C copied not in HEAD, copied from another in index
T mode changed same content in HEAD and index, mode changed
U unmerged conflict between HEAD and index; resolution required

  每二个字符表示工作区的状态 

letter meaning description
- new/unknown not in index, in work tree
m modified in index, in work tree, modified
d deleted in index, not in work tree

 

repo prune <topic> 

 删除已经merge的分支

repo abandon <topic>

 删除分支,无论是否merged

repo branch或repo branches

 查看所有分支

repo diff

查看修改

repo upload

上传本地提交至服务器

repo forall [PROJECT_LIST]-c COMMAND

 对指定的Project列表或所有Project执行命令COMMAND,加上-p参数可打印出Project的路径。

repo forall -c 'git reset --hard HEAD;git clean -df;git rebase --abort'

这个命令可以撤销整个工程的本地修改。

比如:

把所有的库切换分支:  repo forall  -c git checkout branch_name

删除所有库的某个分支: repo forall  -c git branch -D branch_name

实例: repo forall -c "git co aosp/o-preview -b o-preview"

 

2)repo常用命令:
repo init (下载repo并克隆manifest);
repo sync(下载代码);
repo start(创建并切换分支);
repo checkout(切换分支);
repo branches(查看分支);
repo diff(查看工作区文件差异);
repo stage(把文件添加到index表中);
repo prune(删除已经合并分支);
repo abandon(删除指定分支);
repo status(查看文件状态);
*repo remote(设置远程仓库);
*repo push(向服务器提交代码);
merge(合并多个分支);
tag(打标签);
remote (设置远程仓库);
branch(创建特性分支);
 

 

git commit --amend