firemail
标题: git命令行操作 [打印本页]
作者: java 时间: 2017-3-2 15:12
标题: git命令行操作
本帖最后由 java 于 2019-5-28 11:37 编辑
git config --global user.email "***@xxx.com"
git config --global user.name "***"
# 配置默认编辑器, 默认是nano, 可以配置为vim 或其他
git config --global core.editor vim
#配置比较工具.可以用git difftool 调用.
git config --global diff.tool meld
git config --global difftool.prompt false
远程路径修改 如邮箱地址大小写变化了。git remote -v查看原来的路径后,
直接修改.git/config文件
$ git status
$ git log
$ git checkout -b "backup"
$ git checkout discover
$ ssh-keygen
(/c/Users/xxx/.ssh/id_rsa)
$ git config -l
Hint: To automatically insert Change-Id, install the hook:
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 xx@192.168.11.56:hooks/commit-msg ${gitdir}/hooks/
.git\hooks\commit-msg
git commit --amend
git push origin HEAD:refs/for/discover
$ git pull --rebase
$ git add sub
$ git submodule update
$ git pull
内容回退
$ git checkout account-duiba/
$ git reset .
添加
git status
git add .
git status
git commit (vi 编辑)
$ git push origin HEAD:refs/for/discover
对比$ git diff
数据暂存及恢复
$git stash
do some work
$git stash pop
查看 git 提交到本地但未push到远端的代码
git log 本地branch ^远程分支 可以查看本地有远程没有的提交。
git log master ^origin/master
git log 远程分子 ^本地branch 可以查看远程有,本地没有的提交。
查看clone的源码路径
git remote -v
git reset HEAD^1 --hard
git reset --help
git log 有许多选项可以帮助你搜寻感兴趣的提交,接下来我们介绍些最常用的。
我们常用 -p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新:
git log -p -2
--stat,仅显示简要的增改行数统计:
git log --stat
git log --pretty=format:"%h %s" --graph
git log -p 431072838ba5ab7b9d28614e6e78b3be6a84145c (查看具体某次提交的变化)
https://git-scm.com/book/zh/v1/G ... 4%E5%8E%86%E5%8F%B2
本地创建新分支
git checkout -b local/list_sort_0615
==================git-merge
git merge是用来合并两个分支的。
git merge b
# 将b分支合并到当前分支
--ff命令
--ff是指fast-forward命令。当使用fast-forward模式进行合并时,将不会创造一个新的commit节点。默认情况下,git-merge采用fast-forward模式。
--no-ff命令
即使可以使用fast-forward模式,也要创建一个新的合并节点。这是当git merge在合并一个tag时的默认行为。
git checkout master
git pull
git merge --no-ff origin/develop
git push origin HEAD:refs/for/master
-----------------------
merge
把其它分支上的代码 merge到当前分支
git checkout curbarnch
git merge --no-ff origin/develop
git add .
git commit -m "meger 代码合并"
===================================
测试通过后,确定要上线,需要把feature分支合并到develop中,合并前最好先同develop做一次rebase,尽量把冲突放到当前feature分支解决
git checkout feature_lyl_calendarList_0620
git rebase origin/develop
git checkout develop
git merge --no-ff origin/feature_lyl_calendarList_0620 # 解决冲突如果有
为增加changeid增加如下一步
git commit --amend
git push origin HEAD:refs/for/develop
# 上线时,专人把develop merge到master,参照步骤
git checkout master
git pull
git merge --no-ff origin/develop
为增加changeid增加如下一步
git commit --amend
git push origin HEAD:refs/for/master
git fetch --prune
一次性把主线上的改动合并到功能分支用这个
git merge --no-ff origin/develop
/////////////
利用 reflog 撤销变基
git reflog
git reset --hard HEAD@{3}
master与develop一般会是两个不同的分支,只能合并,不用rebase
-----------------------------------Linux(windows)下以https(用户名密码)方式同步代码
git clone https://github.com/xxx/shell.git
...
git commit
git push -u origin master
作者: java 时间: 2017-3-2 15:26
在Windows上更新了git 2.6.3 64bit后,clone时出现,unable to negotiate with 10.0.0.8: no matching key exchange methodfound. Their offer: diffie-hellman-group1-sha1
解决方法:在执行git clone之前,在终端输入:
export GIT_SSH_COMMAND='ssh -o KexAlgorithms=+diffie-hellman-group1-sha1'
这种方法每次新开git窗口,都需要重新输入export GIT_SSH_COMMAND
网上有说是因为客户端和服务器端git版本不一致导致的,也有说如果知道服务器ip,可以在C:\Users\spring\.ssh下新建一个config文件,添加内容如下,但是好像不起作用:
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
Host 10.0.0.8
KexAlgorithms +diffie-hellman-group1-sha1
还有一种方法就是,打开.bashrc文件,在终端输入:$ vim ~/.bashrc ,然后向.bashrc文件写入:
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
export GIT_SSH_COMMAND='ssh -o KexAlgorithms=+diffie-hellman-group1-sha1'
保存并关闭。这样就不需要每次打开终端时都重新输入export GIT_SSH_COMMAND了。
作者: Qter 时间: 2017-3-3 09:02
本帖最后由 Qter 于 2023-3-14 14:16 编辑
1、在PowerShell中输入以下命令
git config --global core.quotepath false
git config --global gui.encoding utf-8
git config --global i18n.commit.encoding utf-8
git config --global i18n.logoutputencoding utf-8
$envESSCHARSET='utf-8'
2、在系统环境变量中添加变量 LESSCHARSET 为 utf-8 .
查看设置的变量
git config --global -l
git config --global --get core.quotepath
git config --global --get gui.encoding
git config --global --get i18n.commit.encoding
git config --global --get i18n.logoutputencoding
取消对变量的设置
git config --global --unset gui.encoding
Permission denied (publickey).
fatal: The remote end hung up unexpectedly.
Permission denied (publickey).
fatal: Could not read from remote repository.
换个目录 ,原来是把代码放到了 /usr/local下
改为/home/xxxx/xx下就可以 了
git fetch --prune
https://git-scm.com/docs/git-fetch
Before fetching, remove any remote-tracking references that no longer exist on the remote
同git remote prune
删除本地分支
git branch -d/D dev -D 强制删除
修改日志格式:
git log --date=iso ---当前查看 一次有效
git config --global log.date iso ---全局生效
----------------------------------------
从本地.git中还原代码
git reset –hard (commit版本hash码)
-------------------
λ git pull
warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:
git config pull.rebase false # merge (the default strategy)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only
You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.
Already up to date.
λ git config --global
usage: git config [<options>]
Config file location
--global use global config file
--system use system config file
--local use repository config file
--worktree use per-worktree config file
-f, --file <file> use given config file
--blob <blob-id> read config from given blob object
Action
--get get value: name [value-regex]
--get-all get all values: key [value-regex]
--get-regexp get values for regexp: name-regex [value-regex]
--get-urlmatch get value specific for the URL: section[.var] URL
--replace-all replace all matching variables: name value [value_regex]
--add add a new variable: name value
--unset remove a variable: name [value-regex]
--unset-all remove all matches: name [value-regex]
--rename-section rename section: old-name new-name
--remove-section remove a section: name
-l, --list list all
-e, --edit open an editor
--get-color find the color configured: slot [default]
--get-colorbool find the color setting: slot [stdout-is-tty]
Type
-t, --type <> value is given this type
--bool value is "true" or "false"
--int value is decimal number
--bool-or-int value is --bool or --int
--path value is a path (file or directory name)
--expiry-date value is an expiry date
Other
-z, --null terminate values with NUL byte
--name-only show variable names only
--includes respect include directives on lookup
--show-origin show origin of config (file, standard input, blob, command line)
--show-scope show scope of config (worktree, local, global, system, command)
--default <value> with --get, use default value when missing entry
之前克隆到本地的项目,用这个命令切换即可,不需要重新克隆:
git remote set-url origin 新地址
如:git remote set-url origin https://192.168.8.7/tt/tt.git
作者: java 时间: 2017-3-3 15:12
本帖最后由 java 于 2018-3-27 17:55 编辑
git 查看某个文件的修改历史
查看文件的每一个详细的历史修改,如果没有-p选项,只显示提交记录,不显示文件内容修改,git log -p -3 filename 显示最近的3次提交。
git log -p 可以依次查看提交时,进行了哪些修改,如果需要看某次commit的修改,后面只需要跟上对应的commit id即可
2. git log --pretty=oneline filename
每一行显示一个提交,先显示哈希码,再显示提交说明。
3. git blame filename
查看文件的每一行是哪个提交最后修改的。
progit上的更加详细
如果想看某个用户的commit情况呢?
git log –author=str 可以指定看某个指定用户的commit log,当然这里的str可以是正则表达式
根据某些匹配规则进行过滤呢?
git log –grep=str 同样这里的str可以是正则表达式
作者: java 时间: 2017-3-9 09:13
本帖最后由 java 于 2018-6-13 16:28 编辑
Gerrit,一种免费、开放源代码的代码审查软件,使用网页界面。利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改。
git将当前分支上修改的东西转移到新建分支
比如我在A分支做了一些修改,现在由于某种原因(如A分支已经合并到master)不能把A分支上修改的东西保留下来但是需要把A分支上修改的东西继续在新分支继续修改。那么现在我们可以有两种简单的做法完成这一需求。
第一种方法我们不需要在A分支做commit,只需要在A分支新建B分支,然后切换过去。这个时候你会发现修改的东西在A,B分支都有。这个时候在B分支commit,那么这些修改保留在B分支上,再切换到A分支上会发现修改都没有保留下来。
第二种方法使用git stash 将A分支暂存起来,然后在某一个分支(如master分支)新建一个分支B,然后在B分支上使用git stash pop 将修改弹出到B分支上,然后这些修改就在B分支上了。
作者: linux 时间: 2017-3-17 17:45
本帖最后由 linux 于 2017-3-17 17:57 编辑
变基 rebase
整合分支最容易的方法是merge命令,他会把两个分支的最新快照已经两者最近的共同祖先进行三方合并,将合并结果生成一个新的快照并提交。
变基的做法就是将其中一个分支上做的修改在另一个分支上应用,而不进行三方合并。可以使用rebase命令将某个分支上的修改都转移到另一个分支上。
它会首先找到两个分支的最近共同祖先,然后对比当前分支和祖先的历次提交,将相应的修改提取出来,然后将当前分支指向目标分支,最后将之前提取的修改依次应用。
当有多个分支想要合并的时候,可以将两个分支的修改通过变基合并到第三个分支上,这个功能很棒,在多人合作开发时非常有用
变基的风险
不要对在你的仓库外有副本的分支执行变基。
变基操作实质是丢弃一些现有的提交,然后相应的新建一些内容一样的提交。如果已经提交推送,其他人也已经从该仓库拉取并进行了后续操作。此时使用Git rebase命令重新整理提交并推送,其他人将不得不再次的与你的提交进行合并,而且我们还要拉取并合并其他人所做的修改。 原则
只对尚未推送的本地修改执行变基操作,不对已经推送的提交执行变基。
通过merge合并分支:
git merge --h
git checkout master(主分支)
$ git merge --no-ff -m "merge with no-ff" experiment(要合并的分支)
Git merge –no-ff 可以保存你之前的分支历史。能够更好的查看 merge历史,以及branch 状态。
git merge 则不会显示 feature,只保留单条分支记录。
通过rebase合并分支:
?
http://www.jianshu.com/p/ce9fefaab751
一般 git pull --rebase 这样用
变基 vs. 合并至此,你已在实战中学习了变基和合并的用法,你一定会想问,到底哪种方式更好。 在回答这个问题之前,让我们退后一步,想讨论一下提交历史到底意味着什么。
有一种观点认为,仓库的提交历史即是 记录实际发生过什么。 它是针对历史的文档,本身就有价值,不能乱改。 从这个角度看来,改变提交历史是一种亵渎,你使用_谎言_掩盖了实际发生过的事情。 如果由合并产生的提交历史是一团糟怎么办? 既然事实就是如此,那么这些痕迹就应该被保留下来,让后人能够查阅。
另一种观点则正好相反,他们认为提交历史是 项目过程中发生的事。 没人会出版一本书的第一版草稿,软件维护手册也是需要反复修订才能方便使用。 持这一观点的人会使用 rebase 及 filter-branch 等工具来编写故事,怎么方便后来的读者就怎么写。
现在,让我们回到之前的问题上来,到底合并还是变基好?希望你能明白,这并没有一个简单的答案。 Git 是一个非常强大的工具,它允许你对提交历史做许多事情,但每个团队、每个项目对此的需求并不相同。 既然你已经分别学习了两者的用法,相信你能够根据实际情况作出明智的选择。
总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。
作者: linux 时间: 2017-3-25 12:36
查看所在分支
git branch
作者: linux 时间: 2017-3-25 12:45
missing Change-Id in commit message footer
为什么呢?
后来查了些资料,找到一个解决办法,直接在命令行加入报错的绿色部分,再按照一下步骤来就ok了:
$gitdir=$(git rev-parse --git-dir); scp -p -P port name@hostIp:hooks/commit-msg ${gitdir}/hooks/
commit-msg
$ git commit --amend
作者: linux 时间: 2017-3-25 14:14
使用git注意点: 提交前一定要更新到最新代码
万一忘记更新,又进行了提交 则要先进行回退 然后 重新提交
回退过程
1.git log
...
commit abedfef27cc7061e555bdbb9772abc74549a2369
....
commit c685c972f037205c7a235c8582e84c998151766e
...
commit 09ef555dcf45a7cda19d9433626f46dfbaf59fc0
如回退到第三个绿色的部分
git reset 09ef555dcf45a7cda19d9433626f46dfbaf59fc0
git status
git add .
git pull --rebase
另外如果中间有需要的加下
git stash
git stash pop
作者: linux 时间: 2017-3-27 17:31
git clone ssh://xxx@192.168.21.51:3333/proj2
作者: java 时间: 2017-8-17 18:17
本帖最后由 java 于 2017-11-23 16:16 编辑
missing change-id
git commit -a --amend -s
查看某条日志的具体修改内容
git show cdb90e69217a7ac65bc6e52e2622066a05aa10cf
用git show <commit-hashId> 便可以显示某次提交的修改内容
同样 git show <commit-hashId> filename 可以显示某次提交的某个内容的修改信息。
查看某一文件的历史性改动
git log --pretty=oneline 文件名
查看某一目录的修改日志
git log --pretty=format:'%h was %an, %ar, message: %s' srcdir
修改git log默认的时间显示方式
git config log.date iso 临时git config log.date iso --global
查看配置信息
npm config ls -l
设置代理
npm config set proxy http://proxyhostname:proxyport
npm config set https-proxy http://proxyhostname:proxyportnpm的代理设置
git config --global http.proxy "localhost:1080"
git config --global https.proxy http://proxy.com:1234
git config --global https.proxy https://127.0.0.1:8580
移除代理
npm config rm proxy
npm config rm https-proxy
>npm config set proxy null
>npm config set https-proxy null
npm config set proxy false
npm cache clean
--global~/.gitconfig
--system
$(prefix)/etc/gitconfig
--local
.git/config
//config
git config --global -l
git config --global --list
git config --global --unset http.sslverify
git config --global --unset http.proxy
git config --global --unset https.proxy
npm config delete proxy
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'
如果清理完了,还是连接原来的端口,则是下面shell脚本设置了环境变量- export http_proxy=http://127.0.0.1:8787
- export https_proxy=$http_proxy
- git config --global http.proxy $http_proxy
- git config --global https.proxy $https_proxy
复制代码
/etc/profile
~/.bashrc lantern会写到其它文件,直接在这重新定义 export http_proxy=‘’
~/.profile
日志统计
git shortlog -sn 按照提交的commit数量进行统计
git shortlog -sn --since="7 weeks" --until="1 weeks" 对某一个时间段进行统计
查看指定用户的git提交记录git log --author=username
username为指定的用户
作者: java 时间: 2017-8-17 18:25
本帖最后由 java 于 2018-9-29 14:31 编辑
查看远程分支
git branch -a
查看本地分支
git branch
创建分支
git branch test
切换分支到test
git checkout test
删除本地分支
git branch -d test
删除远程分支
命令行 : $ git push origin --delete <BranchName>
查看clone的源码路径
git remote -v
git remote -av
git branch -av
作者: java 时间: 2017-9-20 16:40
本帖最后由 java 于 2017-11-30 16:10 编辑
Linux下以https(用户名密码)方式同步代码
git clone https://github.com/xxx/shell.git
...
git commit
git push -u origin master
http://www.111cn.net/sys/linux/79505.htm
git reset --hard ecd265ac831681c035479d69948313ebf3a4c736 //不保留改动过的内容
git reset 215b364ca8b6f8134230dfba38446594fbb31555 //保存改动过的内容
作者: Qter 时间: 2021-3-8 15:33
[backcolor=var(--color-box-header-blue-bg)]Quick setup — if you’ve done this kind of thing before[color=var(--color-btn-text)][backcolor=var(--color-btn-bg)] Set up in Desktop
or
HTTPSSSH
…or create a new repository on the command line[backcolor=var(--color-bg-tertiary)]
echo "# MyNotebook" >> README.mdgit initgit add README.mdgit commit -m "first commit"git branch -M maingit remote add origin git@github.com:hechengjin/MyNotebook.gitgit push -u origin main
…or push an existing repository from the command line[backcolor=var(--color-bg-tertiary)]
git remote add origin git@github.com:hechengjin/MyNotebook.gitgit branch -M maingit push -u origin main
…or import code from another repositoryYou can initialize this repository with code from a Subversion, Mercurial, or TFS project.
[color=var(--color-btn-text)][backcolor=var(--color-btn-bg)]Import code
作者: Qter 时间: 2021-12-1 14:00
重命名git tag
1. git tag newtag oldtag
2. git tag -d oldtag
3. git push origin :refs/tags/oldtag
4. git push --tags
作者: Qter 时间: 2022-10-26 19:17
如果觉得一遍遍地输入密码很烦,可以按照这个页面 提供的方案来把密码保存起来。 另外还有一个更简单但安全性低一些的方案。执行这行代码:
git config credential.helper store在这之后你只需要再输入一次密码, Git 就会把你的密码保存下来,这之后就再也不用输入了。说它「安全性低」,是因为这条指令会让 Git 把你的密码以明文形式保存在你的电脑上。具体这两种保存密码的方案选择哪个,看你自己了。
作者: Qter 时间: 2022-10-27 10:03
本帖最后由 Qter 于 2022-10-27 10:09 编辑
功能分支合并到主分支并删除功能分支
git checkout master
git pull # merge 之前 pull 一下,让 master 更新到和远程仓库同步
git merge feature1
git push
git branch -d feature1
git push origin -d feature1# 用 -d 参数把远程仓库的 branch 也删了
推送到远程分支
git checkout feature1git push origin feature1
作者: Qter 时间: 2024-10-22 17:29
remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. See https://gxxxxx_git#error-on-git-fetch-http-basic-access-denied
fatal: Authentication failed for 'https://gitxxc.git/'
凭据管理器,Windows凭据 更新密码
欢迎光临 firemail (http://firemail.wang:8088/) |
Powered by Discuz! X3 |