git常用操作

工作中git常用操作记录,自己用的也不是特别熟练,希望大家多多指教,以后会继续完善。

1. 基础使用

# git clone url <asName> 从现有的repository克隆到本地,最后的asName是别名,可选项

#新建本地仓库 (安装git后)在要创建git仓库repository的地方右键 git bash here
$git init repository
cd repositoryName 命令行进入git仓库

#如果是已有代码,可以先命令行进入代码目录,运行git init 即可

# git status 查看当前git仓库的状况,能知道是否有更新需要暂存add,是否有暂存需要commit 或 reset, 以及commit to push
# git add /rm. add 的作用很多,可以track新文件, 添加修改到stage, rm filename : 移除文件

git add 的使用有不同方式,
# git add <filename> -- 单独一个文件名
# git add <dirname> -- 目录名

# git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A 来一次添加所有改变的文件
# git add -A 表示添加所有内容
# git add . 表示添加新文件和编辑过的文件不包括删除的文件;
# git add -u 表示添加编辑或者删除的文件,不包括新添加的文件

重命名文件,特别是改变文件名称的大小写时,建议使用mv命令,特别是在大小写不敏感的windows操作系统上

#git mv oldFileName newFileName

提交代码

# git commit -m "comment"

# git push 推送到远程repository

如果远程库有更新,则需要先更新后再提交
# git pull 拉取最新的内容

建议频繁使用
git status
git add
git commit
git push

 

一些配置文件可能和本地的设定有关,团队中每个人不一样,如引入本地包的绝对路径等,这就需要忽略这些已经纳入git中的文件:

设定:

git update-index --assume-unchanged <files>

取消设定:

git update-index --no-assume-unchanged <files> 

 

追加提交

git commit --amend

2. 从已有项目创建git repository

#连接到远程仓库并为该仓库repository创建别名 , 别名为origin . 这个别名是自定义的,通常用origin ; 远程repository地址
git remote add origin 添加远程仓库地址

#查看远程仓库

git remote -v  查看远程仓库地址

git remote show origin  查看远程仓库的基本信息

#创建一个 upStream (上传流),并将本地代码通过这个 upStream 推送到 别名为 origin 的仓库中的 master 分支上
git push -u origin master

远程分支已经有内容时:
push远程分支报错:refusing to merge unrelated histories
git pull origin master --allow-unrelated-histories

3. git 分支

git branch -a --列出所有分支 有 * 的是当前分支
git branch -v --所有分支最后提交信息
git branch newbranch --创建分支
git checkout branch --切换分支,需要先commit所有内容

git push --set-upstream origin newbranch  -- 向新分支提交,需要先设置upstream

git merge branchName --合并分支到当前分支,有冲突时不会提交,需要合并后commit

git cherry-pick commitId --合并一个commit到当前分支(比如在develop分支分别提交了a,b,c,但是只想上线b功能,就可以使用cherry-pick单独合并b到master分支)

git cherry-pick cocommitStart .. commitEnd --合并cocommitStart(不包含)到commitEnd(包含)之间的内容

git cherry-pick cocommitStart^.. commitEnd --合并cocommitStart(包含)到commitEnd(包含)之间的内容

git branch -d branchName --删除分支
以上都是本地分支,建议频繁使用分支

 

删除远程分支

git push origin -delete branchname

tag
git tag   -- 查看tag list

git checkout -b branch-name tag-name   --切换到tag并创建分支,直接切换到tag是不能更改的,tag只是相当于快照

git tag -a tagname -m 'comment'  -- 创建tag

git push origin tagname -- 推送到远程库

git tag -d tagnme  --删除tag

git push origin :refs/tags/tagname  -- 删除远程的tag

4. git撤销

a. 在工作区的改动,未add之前 --恢复工作区的内容
使用git checkout . 恢复全部内容( . ),当然也可以使用git checkout <filename> 或git checkout <dirname>

b. 改动已经执行过add命令 --恢复暂存区的内容
git reset HEAD . -- 全部恢复
git reset HEAD <filename>

c. 改动已经commit,但是未push --恢复本地仓库的内容
先git log 查看提交历史中的commitid
git reset <commitid> --退到工作空间,即把commit 回退 、add 回退,工作目录里面的修改还在

git reset --soft <commitid> --退到暂存区,即把commit 回退 add 不回退
git reset --mixed <commitid> --退到工作空间,默认行为,即把commit 回退 add 不回退

************不可轻用,会丢失工作区和暂存区的内容***********************
git reset --hard <commitid> --退到上次commit的位置,即把commit 回退 add 回退 工作空间回退 
************不可轻用***********************

git reset 会丢失提交log,可以用git reflog 查看, 再用git reset reflogid 恢复

 

d. 改动已经push --恢复本地仓库的内容
先git log 查看提交历史中的commitid
git reset <commitid> --退到工作空间,即把commit 回退 、add 回退,工作目录里面的修改还在,【git log 会丢失,恢复:git status 查看,working tree clean , 再git pull】

git reset --soft <commitid> --退到暂存区,即把commit 回退 add 不回退,【git log 会丢失,恢复:git status 查看,working tree clean , 再git pull】
git reset --mixed <commitid> --退到工作空间,默认行为,即把commit 回退 add 不回退

************不可轻用,会丢失工作区和暂存区的内容***********************
git reset --hard <commitid> --退到上次commit的位置,即把commit 回退 add 回退 工作空间回退 【git log 会丢失,恢复:git pull】
************不可轻用***********************

 

git revert 也可以恢复,但会添加一个新的提交

 

5.暂存工作区内容:

#可以加注释

git stash save 'comment'

#查看暂存的内容

git stash show

#查看暂存列表

git stash list

#应用所有的暂存内容

git stash apply  

# 应用一条暂存,$是对应的序号

git stash apply stash@{$}

# 删除一条暂存,$是对应的序号

git stash drop stash@{$}

#清除所有暂存

git stash clear 

 

6.比较差异

git diff 用来比较文件之间的不同,常见用法如下:

git diff:即显示未被add的文件变更

git diff --cached 或 git diff --staged:显示已add但还未commit的文件变更

git diff HEAD:显示所有未commit(包括未add和add两类)的文件变更

git diff branch1 branch2 --stat:比较两个分支上最后 commit 的内容的差别

git diff -–name-only commit1 commit2 > diff_file.diff: 比较两个commit有差异的文件名(name-only)并导出到文件中


7. 用户名配置

# fatal: unable to access错误时执行如下操作


# 1.清除缓存中的配置信息
# 运行一下命令缓存输入的用户名和密码:
# git config --global credential.helper wincred
# 清除掉缓存在git中的用户名和密码
# git credential-manager uninstall

git config --global user.name shiyuan #设置用户名
git config --global user.email shiyuan##@163.com #设置用户邮箱

git config user.name shiyuan #设置本目录的用户名
git config user.email shiyuan##@163.com #设置本目录的用户邮箱

# 然后再push,输入一次用户名密码后再执行2,缓存用户、密码
# 2.创建文件存储GIT用户名和密码
# git config --global credential.helper store


# 执行完后查看%HOME%目录下的.gitconfig文件,会多了一项: ****重新开启git bash***
#   [credential]
#   helper = store
#   重新开启git bash会发现git push时不用再输入用户名和密码

 #3.配置ssh key

首先在git bush客户端中输入:

  ssh-keygen -t rsa -C 'youMailAddress@163.com'

enter键,可根据提示输入生成的key的地址,打开~/.ssh/id_rsa.pub,复制其中的内容,

到github或gitlab的 Settings-->SSH Keys--->Add SSH Key,填写名称并保存,之后就可以使用ssh的方式拉取、提交代码了。

 

#4.git多账户使用ssh
以github和公司gitlab为例:
1.分别使用相应的邮箱创建不同的私钥公钥,分别添加到github和gitlab
2.在.ssh目录下添加config文件,添加以下内容:
#github,IdentityFile为对应的私钥文件
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github
 
#gitlab
Host gitlab.***.com
HostName gitlab.***.com
User git
IdentityFile ~/.ssh/id_rsa
 

 8.常见错误

1.代码库IP地址变化时

 需要更新~/.ssh/known_hosts文件,可以直接删除即可

The ECDSA host key for github***.com has changed,                          
and the key for the corresponding IP address 111.111.111.111                      
is unknown.
 
2.拉取代码后报错
windows下和linux下的文本文件的换行符不一致导致
设置:
git config --global core.autocrlf false
 
 3.新添加sshkey下载时提示, 选择yes即可
Cloning into 'rainbowportal'... The authenticity of host 'gitlab.navinfo.com (10.130.20.233)' can't be established. ED25519 key fingerprint is SHA256:ICm4GpC6C3yhjMdRq7ANl+pYZ7oi+1g+UEtnOVu2Kec. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? Host key verification failed. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
 
 4.git默认忽略文件名的大小写
git config core.ignorecase false
 
5.有访问权限,ssh却报port  22连接拒绝:

ssh: connect to host github.com port 22: Connection refused fatal: Could not read from remote repository.

Please make sure you have the correct access rights

尝试在~/.ssh/config中添加如下:

Host github.com
Hostname ssh.github.com
Port 443
User git

 
 
TODO:

rebase

 

posted on 2019-07-21 17:36  橘生淮南_  阅读(336)  评论(0)    收藏  举报